【问题标题】:Remove duplicates from column从列中删除重复项
【发布时间】:2014-06-22 06:06:05
【问题描述】:

我想删除文件中的重复行(第 2 列的重复项),为每个重复项保留完整的第一行。

示例输入:

10.4.14.1,201s-1-S
10.4.16.1,201s-1-S
10.4.17.1,40-MDF-S
10.4.18.1,201s-1-S
10.4.19.1,201s-1-S
10.4.20.1,201s-1-S
10.4.21.1,201s-1-S
10.4.22.1,201s-1-S
10.4.23.1,201s-1-S
10.4.24.1,MDF-S

想要的结果:

10.4.14.1,201s-1-S
10.4.17.1,40-MDF-S
10.4.24.1,MDF-S

到目前为止我已经尝试过

awk '!k[$5]++' file

awk '!_[$5]++' file

但这不会产生我想要的输出。

【问题讨论】:

    标签: perl awk sed


    【解决方案1】:

    使用 perl 单行代码

    perl -aF, -lne 'print if ! $seen{$F[1]}++' data.txt
    

    输出:

    10.4.14.1,201s-1-S
    10.4.17.1,40-MDF-S
    10.4.24.1,MDF-S
    

    说明:

    开关

    • -a:在空间上分割行并将它们加载到数组中@F
    • -F/pattern/-a 开关的 split() 模式(// 是可选的)
    • -l: 开启行尾处理
    • -n:为输入文件中的每一行创建一个while(<>){..} 循环。
    • -e:告诉perl 在命令行上执行代码。

    【讨论】:

    • 除非你讨厌使用unless,这意味着不使用perl -F, -lane 'print unless $seen{$F[1]}++' data.txt,你也可以使用perl -F, -lane '$seen{$F[1]}++||print' data.txt:P
    【解决方案2】:

    您需要将分隔符设置为,(默认分隔符为空格)并为“seen”数组使用正确的列($2)。

    $ awk -F, '!seen[$2]++' file
    10.4.14.1,201s-1-S
    10.4.17.1,40-MDF-S
    10.4.24.1,MDF-S
    

    【讨论】:

      【解决方案3】:

      您也可以为此使用sort

      $ sort -t, -k2 -u file
      10.4.14.1,201s-1-S
      10.4.17.1,40-MDF-S
      10.4.24.1,MDF-S
      

      【讨论】:

        【解决方案4】:

        这可能对你有用(GNU sed):

        sed -rn '1!G;/^[^,]*(,[^\n]*)\n.*\1/!P;h' file
        

        如果当前行中的第二个字段不是重复的,则打印当前行。

        【讨论】:

          猜你喜欢
          • 2015-09-30
          • 2014-09-30
          • 2021-04-02
          • 2016-01-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多