更简单的方法来计算文本文件中重复行的数量

时间:2015-04-20 20:46:03

标签: bash sorting awk text-files duplicate-removal

我有一个看起来像这样的文本文件:

abc
bcd
abc
efg
bcd
abc

预期的输出是:

3 abc 
2 bcd
1 efg

我知道有一个现有的解决方案:

sort -k2 < inFile |
awk '!z[$1]++{a[$1]=$0;} END {for (i in a) print z[i], a[i]}' |
sort -rn -k1 > outFile 

代码排序,删除重复项,然后再次排序,并打印预期的输出。 但是,是否有更简单的方法来表达z [$ 1] ++ {a [$ 1] = $ 0}部分?我的意思是更“基本”。

2 个答案:

答案 0 :(得分:3)

更基本:

$ sort inFile | uniq -c
      3 abc
      2 bcd
      1 efg

更基本的awk

当习惯使用awk的习语时,表达式!z[$1]++{a[$1]=$0;}清晰简洁。对于那些习惯于使用其他语言编程的人来说,其他形式可能更为熟悉,例如:

awk '{if (z[$1]++ == 0) a[$1]=$0;} END {for (i in a) print z[i], a[i]}'

或者,

awk '{if (z[$1] == 0) a[$1]=$0; z[$1]+=1} END {for (i in a) print z[i], a[i]}'

答案 1 :(得分:0)

如果您的输入文件包含数十亿行,并且您想避免排序,那么您可以这样做:

awk '{a[$0]++} END{for(x in a) print a[x],x}' file.txt