【问题标题】:Remove duplicates from csv (ie remove original and the duplicate)从 csv 中删除重复项(即删除原始和重复项)
【发布时间】:2019-08-04 06:57:48
【问题描述】:

场景:我有两个 csv 文件。一个 CSV 是受信任的地址文件 (trusted.csv),另一个 csv 是测试地址文件 (testing.csv),其中包含与第一个文件相同的地址。

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

【问题讨论】:

  • 欢迎来到stackoverflow。您可以添加到目前为止您尝试过的内容吗?
  • ... 以及一些示例数据和相关的预期输出。谢谢。

标签: perl csv sorting unix unique


【解决方案1】:

正如你所说的sort,我相信基于命令行的解决方案是可以的。

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

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

现在您需要构建模式列表,它是重复行的列表。 uniq 标识重复的 adjacent 行,-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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-03
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 2021-04-09
    相关资源
    最近更新 更多