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

问题描述 投票:-1回答:1

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

问题:trusted.csv已用于打印标签。我需要使用testing.csv生成更多标签,但我不能有任何重复。我尝试合并两个csv文件,但我无法弄清楚如何删除重复条目和违规的原始条目。另一个问题是我需要忽略案例。 sort -uf就像它应该的那样工作,但当然这意味着它保留原始值。

perl csv sorting unix unique
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.