Chinaunix
标题:
一个例子,另关于awk 的二维数组操作一问。
[打印本页]
作者:
sk1418
时间:
2011-03-14 00:17
标题:
一个例子,另关于awk 的二维数组操作一问。
从别处看到有人问一个问题:
一个1万5000多行的文件,如下
294;F03;2000;40441
294;F03;2000;40443
284;F01;5400;44051
284;F01;5700;45666
294;F03;2001;40443
复制代码
要求输出第1,2,4列相同,第3列不同的行。比如上面应该输出1和4行:
294;F03;2000;40443
294;F03;2001;40443
复制代码
我是这么做的,觉得比较笨。不知道有没有更好点的办法。
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来拼下标
作者:
ywlscpl
时间:
2011-03-14 00:38
回复
1#
sk1418
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
复制代码
作者:
yinyuemi
时间:
2011-03-14 04:13
awk -v FS=";" '{v=$1 FS $2 FS $4;a[++b[v]"#"v]=$0}b[v]>1{print (b[v]==2)?a["1#"v] RS a[b[v]"#"v]: a[b[v]"#"v]}'file
复制代码
作者:
sk1418
时间:
2011-03-14 05:08
谢谢两位的精彩awk。
另外关于数组的那个问题希望也给讲解一下。
另加一问,数组的元素还可以是数组么?如果是,怎么操作? 比如 awk -F 'a[1]='foo'; a[2]='bar'; b[1]=a' .... 这样的。 我自己没试出来。
作者:
ywlscpl
时间:
2011-03-14 07:55
awk数组的下标必须是一个确定的值,给数组元素赋的值也必须是一个确定的值
这个确定的值可以是一个变量,可以是字符串
b[1]=a (a为数组名)
这样是非法的
作者:
blackold
时间:
2011-03-14 09:18
294;F03;2000;40443
294;F03;2001;40443
294;F03;2000;40443
这样的行如何处理?
作者:
expert1
时间:
2011-03-14 10:33
回复
6#
blackold
这题我都没看懂什么意思
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2