【问题标题】:How to count duplicates in Bash Shell如何在 Bash Shell 中计算重复项
【发布时间】:2017-10-11 06:24:25
【问题描述】:

大家好,我想计算一列文件中有多少重复项,并将数字放在它们旁边。我使用 awk 并像这样排序

awk -F '|' '{print $2}' FILE | sort | uniq -c

但计数(来自 uniq -c)出现在重复项的左侧。

有没有办法使用我的代码将计数放在右侧而不是左侧?

感谢您的宝贵时间!

【问题讨论】:

  • 欢迎来到堆栈溢出,如果您可以让我们知道示例输入,那么我们可能可以通过单个命令或更好的方式来完成,请让我们知道。

标签: bash shell sorting awk


【解决方案1】:

尽管我相信您应该向我们展示您的 Input_file,以便我们可以为此要求创建一个左右的命令,因为您尚未显示 Input_file,因此尝试使用您的命令本身来解决它。

awk -F '|' '{print $2}' FILE | sort | uniq -c | awk '{for(i=2;i<=NF;i++){printf("%s ",$i)};printf("%s%s",$1,RS)}'

【讨论】:

  • 是的,行得通! input_file 的格式如下:id|browser|name|surname|etc
【解决方案2】:

您可以使用awk 来反转输出,如下所示:

awk -F '|' '{print $2}' FILE | sort | uniq -c | awk {'print $2" "$1'}

【讨论】:

  • 对于“7 Internet Explorer”输出将是“Internet 7”而不是“Internet Explorer 7”
  • 感谢回复,但有问题。通过您的方式,“7 Internet Explorer”使其成为没有 Explorer 部分的“Internet 7”
【解决方案3】:
awk -F '|' '{print $2}' FILE | sort | uniq -c| awk '{a=$1; $1=""; gsub(/^ /,"",$0);print $0,a}'

【讨论】:

  • 逻辑可以工作,但它可能会为每一行提供初始空格,因为我们正在取消第一个字段。
  • 你编辑的一个让Internet Explorer变成一个单词InternetExplorer
【解决方案4】:

您可以使用awk计算重复的数量,因此您的命令可以简化如下,

awk -F '|' '{a[$2]++}END{for(i in a) print i,a[i]}' FILE | sort

【讨论】:

    【解决方案5】:

    检查这个命令:

    awk -F '|' '{c[$2]++} END{for (i in c) print i, c[i]}' FILE | sort
    

    使用 awk 进行计数就足够了。如果您不想按浏览器排序,请删除管道并排序。

    【讨论】:

    • 与我的答案几乎相同。 :)
    • 是的。在我发布我的答案后,我发现你的答案刚刚发布,并且完全一样。我认为这两个答案是迄今为止最好的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2019-08-17
    • 2014-10-16
    • 2013-03-13
    相关资源
    最近更新 更多