【问题标题】:Count duplicates from several files计算多个文件中的重复项
【发布时间】:2017-05-07 19:33:55
【问题描述】:

我有五个文件,其中包含一些重复的字符串。

文件 1:

a

文件2:

b

文件3:

a
b

文件4:

b

文件5:

c

所以我用awk 'NR==FNR{A[$0];next}$0 in A' file1 file2 file3 file4 file5

它会打印$ a,但正如您所见,b 字符串在其他文件中重复了 3 次,但仅打印 a

那么如何使用一行命令通过分析/比较每个文件来获取所有重复的字符串(ab)?另外我如何获得每个元素的重复次数。

【问题讨论】:

  • 如果重复出现在 1 个文件中而不是出现在多个文件中,您是否希望以不同的方式处理重复?如果是这样,您想要什么不同的行为?
  • @EdMorton 但是我从下面的答案中得到了解决方案。我只是想要,因为我希望通过相互比较来查看每个文件的重复值。

标签: linux bash awk terminal text-processing


【解决方案1】:

在 awk 中:

$ awk '{ a[$1]++ } END { for(i in a) if(a[i]>1) print i,a[i] }' file[1-5]
a 2
b 3

它计算每条记录(在本例中为字符)的出现次数,并打印出计数大于 1 的记录。

【讨论】:

    【解决方案2】:

    您可以使用其中一种;

    awk '{count[$0]++}END{for (a in count) {if (count[a] > 1 ) {print a}}}' file1 file2 file3 file4 file5
    

    awk 'seen[$0]++ == 1' file1 file2 file3 file4 file5
    

    您可以针对 a=3 和 b=4 进行测试。

    awk '{count[$0]++} END {for (line in count) if ( count[line] == 3 && line == "a" || count[line] == 4 && line == "b" ) {print line} }' file1 file2 file3 file4 file5
    

    测试:

    $ awk '{count[$0]++}END{for (a in count) {if (count[a] > 1 ) {print a}}}' file1 file2 file3 file4 file5
    a
    b
    
    
    $ awk 'seen[$0]++ == 1' file1 file2 file3 file4 file5
    a
    b
    
    $ awk '{count[$0]++} END {for (line in count) if ( count[line] == 2 && line == "a" || count[line] == 3 && line == "b" ) {print line, count[line]} }' 1 2 3 4 5
    a 2
    b 3
    

    【讨论】:

    • 谢谢,它也可以工作。是否可以计算重复的字符串,例如 (a=3, b=4)?
    【解决方案3】:

    我建议使用 GNU sort 和 uniq:

    sort file[1-5] | uniq -dc
    

    输出:

    2 a
    3 b
    

    来自man uniq

    -d: 只打印重复的行

    -c:按出现次数为行添加前缀

    【讨论】:

    • 谢谢。部分工作。因为它也打印不重复的单词。假设在 file6 中有 C 字符串,那么它也会在输出中打印 C。 *我编辑了问题
    • 谢谢你的工作。我们可以计算重复的字符串吗?喜欢 (a=2, b=3)
    • uniq -d 替换为uniq -d -c。输出:2 a4 b。或将uniq -d 替换为uniq -d -c | awk '{print $2"="$1}'
    • 感谢@cyrus 解决问题 :)
    • 因为您更改了 file3 的内容,所以可以使用更短的答案。感谢@Thor。
    猜你喜欢
    • 1970-01-01
    • 2016-03-08
    • 2013-08-06
    • 2020-05-18
    • 2021-06-04
    • 2021-02-28
    • 2021-08-29
    • 1970-01-01
    相关资源
    最近更新 更多