我将合并多个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中删除所有匹配项。
您需要提供有关问题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)