从csv中删除重复项(即删除原始和重复项)

时间:2019-03-13 14:42:06

标签: perl csv sorting unix unique

方案:我有两个csv文件。一个CSV是受信任的地址文件(trusted.csv),另一个CSV是测试地址文件(testing.csv),该文件将与第一个文件具有重复的地址。

问题:Trusted.csv已经用于打印标签。我需要使用testing.csv生成更多标签,但不能重复。我尝试合并两个csv文件,但无法弄清楚如何删除重复的条目和有问题的原始条目。另一个问题是我需要忽略大小写。 sort -uf可以正常工作,但是当然这意味着它会保留原始值。

1 个答案:

答案 0 :(得分:0)

在您谈论sort时,我相信基于命令行的解决方案是可以的。

这是一个很沉重的解决方案:我相信有更好的解决方案,但目前我还没有更好的主意。

您需要的行与其他行不匹配(或删除匹配的行)。 grep -v的效果非常好,如果添加了-i选项,它不会在意情况。由于您可能要删除许多重复的行,因此-f将成为您的朋友,因为它允许在文件中指定许多模式。指定* -(一个破折号)作为文件名的许多* nix命令和文件选项使该命令从标准输入而不是从存储中的文件读取数据。总结一下:grep -i -f - -v ~/tmp/file将从标准输入中读取文件/tmp/file和模式。它将保留所有与模式不匹配的行,并且无论字符大小写都将进行匹配。

现在,您需要构建模式列表,该列表是重复行的列表。 uniq标识重复的相邻行,-d使其打印一次重复,而-i使其忽略大小写。要使线相邻,可以使用sort,该选项与选项-f也会忽略大小写。因此sort -f ~/tmp/file | uniq -d -i的文件一次打印重复项。

将两个部分放在一起将产生以下命令:sort -f ~/tmp/file | uniq -d -i | grep -i -f - -v ~/tmp/filesort将相同的行分组在一起,以便uniq可以保留重复的行,这些行用作选择要删除的行的模式。

让我们举个例子。以下文件每行只有一个字母(dup仅表示重复的行):

  a              dup
  b
  c              dup
  a              dup
  d
  C              dup
  e
  f
  c              dup
  A              dup

我们的过滤器管道的应用导致:

sort -f ~/tmp/file   |   uniq -d -i   |   grep -i -f - -v ~/tmp/file
         a
         a
         A                                         b
         b                    a                    d
         c        ----->      b     ---->          e
         c                                         f
         C
         d
         e
         f