【问题标题】:Remove all line that contain duplicate entry in column 2删除第 2 列中包含重复条目的所有行
【发布时间】:2019-07-05 04:33:09
【问题描述】:

我有一个包含两列的大文件,我想根据第 2 列中的重复条目删除该行。我想删除两个重复条目。

我试过了:

awk '!seen[$2]++' filename

但它只会删除一个副本。

输入文件示例:

1  3
2  3
4  10
1  6
5  3

预期输出:

4  10
1  6

【问题讨论】:

    标签: awk


    【解决方案1】:

    请您尝试关注一下。

    awk '{seen[$2]++;value[$2]=$0} END{for(i in seen){if(seen[i]==1){print value[i]}}}' Input_file
    

    【讨论】:

    【解决方案2】:
    $ awk 'NR==FNR{cnt[$2]++; next} cnt[$2]==1' file file
    4  10
    1  6
    

    或者如果您不能两次读取输入(例如,如果它来自管道),那么:

    $ awk '{rec[NR]=$0; key[NR]=$2; cnt[$2]++} END{for (i=1; i<=NR; i++) if (cnt[key[i]] == 1) print rec[i]}' file
    4  10
    1  6
    

    【讨论】:

    • 是的,它的打印顺序与输入的顺序相同。
    【解决方案3】:

    使用coreutilsgrep

    # Sort on the second column
    <infile sort -k2,2n | 
    
    # Count number of repeated fields in the second column
    uniq -f1 -c         | 
    
    # Remove fields that are repeated
    grep -E '^ +1 +'    | 
    
    # Squeeze white-space
    tr -s ' '           | 
    
    # Remove repeat count
    cut -d' ' -f3-
    

    输出:

    1 6
    4 10
    

    【讨论】:

      【解决方案4】:

      另一个sortuniqgrep

      $ grep -v -f <(sort -k2n file | uniq -f 1 -D) file
      4  10
      1  6
      

      解释:sort 对第二个字段的file 进行排序:

      1  3
      2  3
      5  3
      1  6
      4  10
      

      uniq -f 1 -D 跳过第一个(空格分隔的)字段并仅打印重复的行:

      1  3
      2  3
      5  3
      

      该列表是grep 的排除列表。

      【讨论】:

        猜你喜欢
        • 2014-04-15
        • 1970-01-01
        • 1970-01-01
        • 2018-10-16
        • 1970-01-01
        • 1970-01-01
        • 2022-06-27
        • 2016-03-09
        • 1970-01-01
        相关资源
        最近更新 更多