我目前正在处理一个处理csv文件的脚本,它所做的一件事就是删除并记下文件中的重复行。我目前的方法是使用uniq -d一次运行uniq以显示所有重复项,然后再次运行uniq而不用任何选项来实际删除重复项。 话虽如此,我想知道是否可以在一个动作中执行相同的功能,而不是必须运行uniq两次。我发现了一些使用awk删除重复项的不同示例,但据我所知,我无法找到任何显示重复项并同时删除它们的示例。 如果有人可以为此提供建议或帮助,我会非常感激,谢谢!
答案 0 :(得分:5)
这是让你入门的东西:
awk 'seen[$0]++{print|"cat>&2";next}1' file > tmp && mv tmp file
上面会将任何重复的行打印到stderr,同时从输入文件中删除它们。如果您需要更多,请告诉我们更多......
答案 1 :(得分:1)
一般而言,您输入的大小应作为指导。如果您正在处理GB数据,除了依赖sort
和uniq
之外,您通常别无选择,因为这些工具支持external操作。
那就是说,这是AWK方式:
如果输入已排序,您可以通过将行i
与行i-1
与 O(1)状态进行比较,轻松跟踪AWK中的重复项:如果i == i-1
您有重复。
如果您的输入未排序,则必须跟踪所有行,需要 O(c)状态,其中 c 是唯一行的数量。为此,您可以在AWK中使用哈希表。
答案 2 :(得分:0)
此解决方案不使用awk
,但它确实产生了您需要的结果。在下面的命令中,用您的csv文件替换sortedfile.txt。
cat sortedfile.txt | tee >(uniq -d > duplicates_only.txt) | uniq > unique.txt
tee
将cat
命令的输出发送给uniq -d
。