2014-10-02 95 views
0

好日子,AWK和矩阵处理

我不知道如何处理(在AWK)方形对称矩阵的事:

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

输入

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

预计输出第六行和列删除

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

预先感谢任何线索

+0

是1234..7和ABCDEFG。在输入文件? – Kent 2014-10-02 22:31:58

+0

nope,它只是用字母或数字来标识每一行和列,如你所愿,用字母或数字 – 2014-10-02 22:36:52

回答

2

此行应工作:

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 
+0

非常感谢,它工作顺利。 :D肯特,如果我问你它是如何工作的,它会太多吗? (我只是想学习)。预先感谢。 (: – 2014-10-02 22:49:02

+1

@Alejandro我读了两次输入文件,第一次是定位全零行索引(行号),第二次打印矩阵,跳过找到的行号也列号 – Kent 2014-10-02 22:50:57

+0

顺便说一句@Kent ,希望现在还不迟,问你:代码如何显示,还有NR删除了吗?先谢谢 – 2014-10-02 23:07:31

0
$ 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 
+0

Thank John1024。但是,我更喜欢Kent的一个,它比较一般,有一个美好的一天(: – 2014-10-02 22:49:43