【问题标题】:Simpler way to count the number of duplicated rows in a text file计算文本文件中重复行数的更简单方法
【发布时间】:2015-06-27 18:42:04
【问题描述】:

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

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} 部分?我的意思是更“基本”。

【问题讨论】:

  • abc 出现3 次时,为什么预期输出有2 abc

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


【解决方案1】:

更基本的:

$ 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]}'

【讨论】:

  • 不是他的预期输出,虽然这正是我的想法。
  • @ptierno 是的。由于 OP 的 awk 语句为 abc 生成了 3 个计数,因此我认为 2 是一个错字。
  • 啊,是的,我在那里打错了字。应该是 3 abc。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 2012-12-13
    • 1970-01-01
    • 2012-06-29
    • 2013-05-05
    • 2018-08-20
    • 2016-03-08
    相关资源
    最近更新 更多