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