场景:我有两个csv文件。一个CSV是受信任的地址文件(trusted.csv),另一个csv是测试地址文件(testing.csv),它将具有第一个文件中的重复地址。
问题:trusted.csv已用于打印标签。我需要使用testing.csv生成更多标签,但我不能有任何重复。我尝试合并两个csv文件,但我无法弄清楚如何删除重复条目和违规的原始条目。另一个问题是我需要忽略案例。 sort -uf就像它应该的那样工作,但当然这意味着它保留原始值。
当你在谈论sort
时,我相信基于命令行的解决方案是可以的。
这是一个非常重的解决方案:我相信有更好的东西,但目前我没有更好的主意。
您需要与其他行不匹配的行(或删除那些匹配的行)。 grep -v
做得非常好,如果加上-i
选项,它不关心这个案子。因为你可能有许多重复行删除-f
将是你的朋友,因为它允许在文件中指定许多模式。由于许多* nix命令和文件选项将-
(单个破折号)指定为文件名,因此该命令从标准输入而不是从存储上的文件中读取数据。总结一下:grep -i -f - -v ~/tmp/file
将读取文件/tmp/file
和标准输入中的模式。它将保留所有与模式不匹配的行,并且无论字符大小写,匹配都将完成。
现在您需要构建模式列表,该列表是重复行的列表。 uniq
识别重复的相邻行,-d
使它打印重复一次,-i
使它忽略该情况。要使线相邻,你可以使用sort
,选项-f
也忽略了这种情况。所以sort -f ~/tmp/file | uniq -d -i
得到一个文件打印重复一次。
将两个部分放在一起会产生以下命令:sort -f ~/tmp/file | uniq -d -i | grep -i -f - -v ~/tmp/file
。 sort
将相同的行组合在一起,以便uniq
可以保留重复的那些,用作模式来选择将被删除的行。
我们来举个例子吧。下面的文件每行有一个字母(dup
只标识重复的行):
a dup
b
c dup
a dup
d
C dup
e
f
c dup
A dup
我们的过滤器管道的应用导致:
sort -f ~/tmp/file | uniq -d -i | grep -i -f - -v ~/tmp/file
a
a
A b
b a d
c -----> b ----> e
c f
C
d
e
f