【问题标题】:To find repeated matches by `uniq -d`通过 `uniq -d` 查找重复的匹配项
【发布时间】:2009-07-25 11:20:32
【问题描述】:

我的数据为 /tmp/1

9367543
9105616
9108177
8948074
8860323
9170406
9105616

我跑了,我什么也得不到

cat /tmp/1 | uniq -d

这很奇怪,因为uniq -d应该

-d      Only output lines that are repeated in the input.

如何使用uniq -d

【问题讨论】:

    标签: uniq


    【解决方案1】:

    在使用 uniq 之前,您必须对数据进行排序。它只删除/检测相邻行上的重复项。

    【讨论】:

    • 或者使用 awk 脚本来正确完成这项工作?
    • 感谢您指出这一点! --- 它甚至在手册中说The uniq utility reads the specified input_file comparing adjacent lines - -.
    • 使用我的 GNU coreutils uniq 手册说:丢弃所有来自 INPUT(或标准输入)的连续相同行,但写入 OUTPUT(或标准输出)。
    【解决方案2】:

    试试这个仔细检查,它会输出任何重复的行:

      cat /tmp/1 |  awk 'seen[$0]++ == 1'
    

    哦,这是你的问题:

     cat /tmp/1 | sort | uniq -d
    

    在运行 uniq 之前对其进行排序!

    【讨论】:

    • Masi 示例文件的第 2 行和第 7 行是相同的。但它们不是连续的,这似乎是误解的核心。
    • ghostdog,我正在使用 cat,因为 OP 也使用了。是的,我知道我可以改用 shell 重定向,或者作为命令行参数提供给 awk 或排序。戴夫,谢谢。没看到那个!已编辑。
    【解决方案3】:
    awk '{_[$0]++}END{for(i in _)if(_[i]>1) print i}' /tmp/1
    

    或者只是

    awk '_[$0]++ == 1' file
    

    【讨论】:

    • awk '_[$0]++' 仅在每行最多有一个重复项的情况下才有效。如果三行相同,则会打印两次。
    猜你喜欢
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 2020-01-30
    相关资源
    最近更新 更多