如何从文件中删除重复的行

时间:2009-04-14 07:51:59

标签: unix command-line duplicates

我有一个生成测试并预测输出的工具。我的想法是,如果我失败了,我可以将预测与实际输出进行比较,看看它们分歧的地方。问题是实际输出包含两行,这会混淆diff。我想删除重复项,以便我可以轻松地比较它们。基本上,像sort -u但没有排序。

是否有可以执行此操作的unix命令行工具?

5 个答案:

答案 0 :(得分:24)

uniq答案的补充,如果您不介意sort首先使用您的文件,这些答案会很有效。如果您需要删除不相邻的行(或者如果您想删除重复项而不重新排列文件),则以下Perl单行应该执行此操作(从here中窃取):

cat textfile | perl -ne '$H{$_}++ or print'

答案 1 :(得分:19)

uniq(1)

概要

  

uniq [OPTION] ... [INPUT [OUTPUT]]

说明

  

丢弃INPUT(或标准输入)中连续相同的一行,写入OUTPUT(或标准输出)。

或者,如果你想删除不相邻的重复行,perl的这个片段也会这样做:

while(<>) {
    print $_ if (!$seen{$_});
    $seen{$_}=1;
}

答案 2 :(得分:1)

如果您有兴趣删除相邻的重复行,请使用uniq

如果你想删除所有重复的行,而不仅仅是相邻的行,那就更难了。

答案 3 :(得分:1)

这是我在这里等待答案的时候提出的问题(虽然第一个(并且接受的)答案是在大约2分钟内得出的)。我在VIM中使用了这种替换:

%s/^\(.*\)\n\1$/\1/

这意味着:查找换行后我们和以前一样的行,并将它们替换为我们在第一行中捕获的行。

uniq肯定更容易。

答案 4 :(得分:1)

这是一个awk实现,因为环境没有/ allow perl(尚未见过)! PS:如果有多个重复的行,则打印重复的输出。

awk '{

# Cut out the key on which duplicates are to be determined.
key = substr($0,2,14)

#If the key is not seen before, store in array,else print
if ( ! s[key] )
    s[key] = 1;
else
    print key;
}'