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

Pea*_*ior 2 linux csv bash

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

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

2)然后创建第二个输出文件以查看被删除的内容,以防万一删除了不应该删除的内容。

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

如果有人可以通过命令帮助我,那就太好了!如果需要澄清,请告诉我。

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

我有一个这样的csv文件:

column1    column2

john       kerry
adam       stephenson
ashley     hudson
john       kerry
etc..
Run Code Online (Sandbox Code Playgroud)

我想从此文件中删除重复项,以仅获取1处的问题:

column1    column2

john       kerry
adam       stephenson
ashley     hudson
Run Code Online (Sandbox Code Playgroud)

对于问题3,我想获取第二个列表...表示第一个列表的输出并进一步整理此列表。我想要一个像input.txt这样的文件,其中包含:

adam
Run Code Online (Sandbox Code Playgroud)

然后,最终输出将是:

column1    column2

john       kerry
ashley     hudson
Run Code Online (Sandbox Code Playgroud)

因此,示例中的input.txt文件包含单词adam(通过这种方式,我可以列出一长串单词来检查input.txt文件)。对于#3,我需要一个代码片段,它将检查所有单词输入文件的CSV所有行的第1列,然后从csv中删除所有匹配项。

jay*_*ngh 6

您需要提供有关问题3的更多详细信息,但对于问题1和2,下面的awk一栏内容将起作用。

awk 'seen[$0]++{print $0 > "dups.csv"; next}{print $0 > "new.csv"}' mycsv
Run Code Online (Sandbox Code Playgroud)

并添加了一些空格以使内容更清晰:

awk 'seen[$0]++ {
  print $0 > "dups.csv"; next
}
{
  print $0 > "new.csv"
}' mycsv
Run Code Online (Sandbox Code Playgroud)

这不会将任何内容打印到STDOUT,但会创建两个文件。dups.csv将包含所有重复项(也就是说,如果同一行中有5个条目,则该文件将包含作为重复项删除的4个条目),并且new.csv将包含所有唯一行。

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

$0整行使用手段。如果要指定更少的列,可以这样做。您只需要基于定界符设置输入字段分隔符即可。您已经提到,csv但是我看不到任何comma分隔符,因此我使用的是默认分隔符[[:space:]]+

另外,它是逗号分隔的,我只是在提供示例数据。因此,如果我想使用上面的示例,但只想测试第3列和第4列(使用seeed命令),我将如何在用逗号分隔的文件中执行此操作?

如果为true csv,则将字段分隔符设置为,seen不是命令。这是将列保留为键的哈希。因此,您将上面的命令修改为:

awk -F, 'seen[$3,$4]++{print $0 > "dups.csv"; next}{print $0 > "new.csv"}' mycsv
Run Code Online (Sandbox Code Playgroud)

更新:

使用上面列出的命令获得没有重复的列表之后。我们剩下:

$ cat new.csv 
john,kerry
adam,stephenson
ashley,hudson
Run Code Online (Sandbox Code Playgroud)

$ cat remove.txt 
adam
Run Code Online (Sandbox Code Playgroud)

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