【问题标题】:AWK and matrices handlingAWK 和矩阵处理
【发布时间】:2014-10-03 06:46:55
【问题描述】:

早安,

我想知道如何(在 awk 中)处理一个正方形和对称矩阵:

  1. 标识只有零的行。
  2. 删除该行及其对称列。
  3. 打印结果矩阵。

输入

  1234567
 xabcdefg
1a0101101
2b1010001
3c0101001
4d1010101
5e1001000
6f0000000
7g1111000

预期输出 第六行第六列已删除

  123457
 xabcdeg
1a010111
2b101001
3c010101
4d101011
5e100100
7g111100

提前感谢任何线索

【问题讨论】:

  • 是输入文件中的 1234..7 和 abcdefg.. 吗?
  • 不,只是用字母或数字来标识每一行和每一列

标签: matrix awk


【解决方案1】:

这条线应该可以工作:

awk  'BEGIN{FS=OFS=""}NR==FNR{if(/^0+$/)z[NR];next}
                      !(FNR in z){for(x in z)$x="";print}' file file

测试:

kent$  cat f
0101101
1010001
0101001
1010101
1001000
0000000
1111000

kent$  awk  'BEGIN{FS=OFS=""}NR==FNR{if(/^0+$/)z[NR];next}!(FNR in z){for(x in z)$x="";print}' f f 
010111
101001
010101
101011
100100
111100

它也适用于多个“全零”行:

kent$  cat f
00001
00000
00000
00000
10000

kent$  awk  'BEGIN{FS=OFS=""}NR==FNR{if(/^0+$/)z[NR];next}!(FNR in z){for(x in z)$x="";print}' f f
01
10

【讨论】:

  • 非常感谢,它运行顺利。 :D Kent,如果我问你它是如何工作的,会不会太过分了? (我只是想学习)。预先感谢。 ( :
  • @Alejandro 我两次读取输入文件,第一次是定位全零行索引(行号),第二次,打印矩阵,跳过定位的行号和列号。
  • 顺便@Kent,希望现在问你还为时不晚:代码如何显示,NR 已删除?提前致谢
  • @Alejandro 所有零行的索引都存储在z 数组中。执行for(x in z)print x 你会看到所有数字。
【解决方案2】:
$ awk '{row[NR]=$0} $0=='0000000' {bad=NR} END{for (i=1;i<=NR;i=i+1+(i==bad-1)) {print substr(row[i],1,bad-1) substr(row[i],bad+1)}}' input
010111
101001
010101
101011
100100
111100

【讨论】:

  • 感谢 John1024。但是,我更喜欢肯特的那个,它更笼统。祝你有美好的一天(:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多