+ -
当前位置:首页 → 问答吧 → 一个例子,另关于awk 的二维数组操作一问。

一个例子,另关于awk 的二维数组操作一问。

时间:2011-03-14

来源:互联网

从别处看到有人问一个问题:

一个1万5000多行的文件,如下
  1. 294;F03;2000;40441
  2. 294;F03;2000;40443
  3. 284;F01;5400;44051
  4. 284;F01;5700;45666
  5. 294;F03;2001;40443
复制代码
要求输出第1,2,4列相同,第3列不同的行。比如上面应该输出1和4行:
  1. 294;F03;2000;40443
  2. 294;F03;2001;40443
复制代码
我是这么做的,觉得比较笨。不知道有没有更好点的办法。
  1. awk -F';' '{a[$1 FS $2 FS $4]=a[$1 FS $2 FS $4]?a[$1 FS $2 FS $4]","$3:$3;} END { for (k in a ){ if( split(a[k],t,",")>1 ){ split(k,h,FS); for (i in t) print h[1] FS h[2] FS t[i] FS h[3] } } }' t.txt
复制代码
我最初想法是,弄一个2维数组,类似 (非AWK code,就说明个意思) a[$1$2$4][$3], 然后遍历第一维是[$1$2$4]第2维个数大于1的所有元素并打印。但是不知道怎么折腾这个二维数组。

比如2维下标都是字符串,怎么 array[a,b], [a,c] ...[a,x], 怎么获得有多少元素第一下标是a的?要是2个下标都是变量构成比如[$1,$2],怎么做如下遍历:
[a,b]
[a,c]
...
[a,x]

[b,b]
[b,c]
...
[b,x]
...

google了也没找到合适的,都是说用split来拼下标

作者: sk1418   发布时间: 2011-03-14

回复 sk1418
  1. awk -F ';' '{a[$1","$2","$4]++;b[$1","$2","$4"#"$3]=$0}END{for (i in b) {split(i,m,"#");if (a[m[1]]>1) print b[i]}}' file
复制代码

作者: ywlscpl   发布时间: 2011-03-14