【问题标题】:Bash/Shell: How to remove duplicates from csv file by columns?Bash/Shell:如何按列从 csv 文件中删除重复项?
【发布时间】:2014-10-16 12:20:29
【问题描述】:

我有一个用 ; 分隔的 csv。我需要删除第 2 列和第 3 列的内容不唯一的行,并将材料传送到标准输出。

示例输入:

irrelevant;data1;data2;irrelevant;irrelevant  
irrelevant;data3;data4;irrelevant;irrelevant  
irrelevant;data5;data6;irrelevant;irrelevant  
irrelevant;data7;data8;irrelevant;irrelevant  
irrelevant;data1;data2;irrelevant;irrelevant  
irrelevant;data9;data0;irrelevant;irrelevant  
irrelevant;data1;data2;irrelevant;irrelevant  
irrelevant;data3;data4;irrelevant;irrelevant  

期望的输出

irrelevant;data5;data6;irrelevant;irrelevant  
irrelevant;data7;data8;irrelevant;irrelevant  
irrelevant;data9;data0;irrelevant;irrelevant  

我找到了只将第一行打印到输出的解决方案:

sort -u -t ";" -k2,1 file  

但这还不够。

我尝试使用uniq -u,但找不到只检查几列的方法。

【问题讨论】:

  • 在所有行中,第 2 列和第 3 列中没有唯一值。
  • 我同意@jaypal,这个问题是关于仅查找唯一记录的。
  • @AvinashRaj:OP 想要列出那些 col2, col3 在整个文件中只出现一次的记录。
  • 哦,谢谢@anubhava
  • 是的,@anubhava 是对的。将材料存储在一些临时模板中似乎是唯一的方法。 awk 和 perl 的解决方案似乎都非常相似。

标签: bash shell sorting csv uniq


【解决方案1】:
awk '!a[$0]++' file_input > file_output

这对我有用。它比较整行。

【讨论】:

    【解决方案2】:

    如果顺序很重要,如果你可以使用perl,那么:

    perl -F";" -lane '
        $key = @F[1,2]; 
        $uniq{$key}++ or push @rec, [$key, $_] 
    }{ 
        print $_->[1] for grep { $uniq{$_->[0]} == 1 } @rec' file
    irrelevant;data5;data6;irrelevant;irrelevant  
    irrelevant;data7;data8;irrelevant;irrelevant  
    irrelevant;data9;data0;irrelevant;irrelevant  
    

    我们使用 column2 和 column3 来创建复合键。我们通过将键和行推送到数组rec 来创建数组的数组,以便第一次出现该行。

    END 块中,我们检查该事件是否是唯一的事件。如果是这样,我们继续打印该行。

    【讨论】:

      【解决方案3】:

      使用awk

      awk -F';' '!seen[$2,$3]++{data[$2,$3]=$0}
            END{for (i in seen) if (seen[i]==1) print data[i]}' file
      irrelevant;data5;data6;irrelevant;irrelevant
      irrelevant;data7;data8;irrelevant;irrelevant
      irrelevant;data9;data0;irrelevant;irrelevant
      

      解释:如果$2,$3 组合在seen 数组中不存在,则带有$2,$3 键的新条目将与整个记录一起存储在data 数组中。每次找到$2,$3 条目时,$2,$3 的计数器都会递增。然后最后打印那些带有counter==1 的条目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-24
        • 2014-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-22
        • 1970-01-01
        相关资源
        最近更新 更多