计算文本文件中重复行数的更简单方法
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
我有一个如下所示的文本文件:
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