我将合并许多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中删除任何匹配。
答案 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