我有一个看起来像这样的文本文件:
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}部分?我的意思是更“基本”。
答案 0 :(得分:3)
更基本:
$ sort inFile | uniq -c
3 abc
2 bcd
1 efg
当习惯使用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