Linux Bash命令用于从CSV文件中删除重复项

时间:2014-08-19 21:28:25

标签: linux bash csv

我将合并许多CSV文件。我想做的是:

1)从文件中删除重复的行,但是,我需要检查多个列作为复制的标准。我该怎么做?

2)然后创建一个第二个输出文件以查看删除了哪些内容不应被删除的内容,这将是很好的。

3)创建项目列表作为输入文件作为a运行(如果此行在此特定列中包含此单词,则删除整行。

如果有人可以帮我完成这个命令,那就太好了!如果我需要澄清,请告诉我。

以下是数据外观的示例(这是建议的示例):

我有一个像这样的csv文件:

column1    column2

john       kerry
adam       stephenson
ashley     hudson
john       kerry
etc..

我想删除此文件中的重复项,仅针对1:

处的问题
column1    column2

john       kerry
adam       stephenson
ashley     hudson

对于问题3,我想采取第二个列表...意味着第一个列表的输出并进一步擦除。我想要一个像input.txt这样的文件,其中包含:

adam

然后,最终输出将是:

column1    column2

john       kerry
ashley     hudson

因此,示例中的input.txt文件包含单词adam(这样我就可以在input.txt文件中创建一长串单词)。对于#3,我需要一个代码snipet,它将检查所有单词输入文件的CSV行的第1列,然后从csv中删除任何匹配。

1 个答案:

答案 0 :(得分:4)

您需要提供问题3的更多详细信息,但对于问题1和2,以下awk单行将有效。

awk 'seen[$0]++{print $0 > "dups.csv"; next}{print $0 > "new.csv"}' mycsv

为了清晰起见,添加了一些空格:

awk 'seen[$0]++ {
  print $0 > "dups.csv"; next
}
{
  print $0 > "new.csv"
}' mycsv

这不会向STDOUT打印任何内容,但会创建两个文件。 dups.csv将包含所有重复项(即,如果有5个相同行的条目,此文件将包含4个作为重复项删除的条目),这些副本已被删除,new.csv将包含所有唯一行。

seen[$0]++是我们为每一行做的测试。如果我们的数组中存在该行,则会将其插入dups.csv文件,我们将使用next移至下一行。如果line不存在,我们将该行添加到数组并将其写入new.csv文件。

使用$0表示整行。如果要指定较少的列,则可以执行此操作。您只需要根据分隔符设置输入字段分隔符。您提到了csv,但我没有看到任何comma分隔符,因此我使用的是[[:space:]]+的默认分隔符。

此外,它以逗号分隔,我只是放样本数据。所以,如果我想使用上面的例子,但想要只测试第3列和第3列。 4(使用see命令),我将如何在逗号分隔文件中执行此操作?

对于true csv,只需将字段分隔符设置为,即可。 seen不是命令。它是一个将列保留为键的哈希。因此,您将上述命令修改为:

awk -F, 'seen[$3,$4]++{print $0 > "dups.csv"; next}{print $0 > "new.csv"}' mycsv

<强>更新

使用上述命令获得没有重复的列表。我们留下:

$ cat new.csv 
john,kerry
adam,stephenson
ashley,hudson

$ cat remove.txt 
adam

$ awk -F, 'NR==FNR{remove[$1]++;next}!($1 in remove)' remove.txt new.csv 
john,kerry
ashley,hudson