如何用单条awk命令实现同列记录合并及记录数量统计
嘿,你这个需求其实不用拆成两条命令,在同一个awk脚本里就能搞定!先理清楚你的场景:
首先是输入文件f的内容:
$ cat f a a1 a a2 a a3 b b1 b b2 b b3 b b4 c c1 c c2 c c3
你已经能用这条awk命令把同一键的对应值合并输出:
$ awk '{a[$1]=a[$1]OFS$2} END {for (k in a) print k ,a[k]}' f a a1 a2 a3 b b1 b2 b3 b4 c c1 c2 c3
现在要在每行末尾追加对应值的数量,直接在脚本里加个计数数组就行,试试这条单命令:
$ awk '{a[$1] = a[$1] OFS $2; count[$1]++} END {for (k in a) print k a[k], count[k]}' f a a1 a2 a3 3 b b1 b2 b3 b4 4 c c1 c2 c3 3
简单说下逻辑:
- 每读一行,除了用
a[$1]拼接当前键对应的所有值,同时用count[$1]++给这个键的计数加1,一步完成拼接和统计 - 处理完所有行后,遍历每个键
k,输出键+拼接好的值,再跟上对应的计数就搞定了
如果不想用额外的计数数组,也可以用split函数拆分拼接后的字符串来统计数量,但这种方法对大文件来说效率会低一点,毕竟每次都要拆分字符串:
$ awk '{a[$1] = a[$1] OFS $2} END {for (k in a) {split(a[k], tmp); print k a[k], length(tmp)}}' f
相比你原来的管道方法,单条awk命令只需要遍历一次文件,效率更高,代码也更紧凑。
内容的提问来源于stack exchange,提问作者VIPIN KUMAR
相关产品推荐
相关产品推荐

