文本:
1 2 3
4 5 6
7 8 9
10 11 12
1 3 4
1 5 6
1 7 8
1 10 11
1 12 4
统计出现次数最多的那个数,并打印出这个数所在的行(1出现次数最多,就打印出1所在的行):
1 2 3
1 3 4
1 5 6
1 7 8
1 10 11
1 12 4
- awk 'BEGIN{while(getline<"file"){for(i=0;i++<NF;){if(++a[$i]>j){k=$i;j=a[$i]}}}}$0~"\\<"k"\\>"' file
[解析]
我不知道还有没有更好的办法,这是我的思路,也证明是成功的。首先在BEGIN中就通过for循环挨着统计每个字段的数量,得出最多的那个数,然后读取每行看是否匹配到这个数字,成功就打印。问题在于平时我们惯用的表达式比如 $0~/[0-9]/ 这样的正则,或者直接是 $0~1 ,我们得出了k变量是出现最多的那个数字,这个值是1,如果用 $0~k 的话会匹配到包含1的数字比如说11,那么就需要锚定划定边界,这里就需要转义了。
- awk '{for(i=0;i++<NF;){a[$i]=a[$i]?a[$i]RS$0:$0;if(m<length(a[$i])){m=length(a[$i]);ind=$i}}}END{print a[ind]}' file
[解析]
这个就是把每个字段的值和它对应的行赋值给数组a,最后长度最大的值的输出该数组内容,就是所在的行了。
阅读(1830) | 评论(0) | 转发(0) |