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

Simpler way to count the number of duplicated rows in a text file

我有一个如下所示的文本文件:

abc
bcd
abc
efg
bcd
abc

预期的输出是这样的:

3 abc 
2 bcd
1 efg

我知道有一个解决方案:

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

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

更基本的:

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

更基本的 awk

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

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

或者,

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

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

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