我有一个工具可以生成测试并预测输出。我的想法是,如果出现故障,我可以将预测结果与实际输出进行比较,以查看它们的差异。问题在于,实际输出会包含一些重复的行,这会让 diff
感到困惑。因此,我想要去除重复行,以便轻松地进行比较。基本上,就像 sort -u
,但不需要排序。
是否有任何 Unix 命令行工具可以做到这一点?
我有一个工具可以生成测试并预测输出。我的想法是,如果出现故障,我可以将预测结果与实际输出进行比较,以查看它们的差异。问题在于,实际输出会包含一些重复的行,这会让 diff
感到困惑。因此,我想要去除重复行,以便轻松地进行比较。基本上,就像 sort -u
,但不需要排序。
是否有任何 Unix 命令行工具可以做到这一点?
和使用uniq
的答案相反,它们在你不介意先对文件进行sort
排序时效果很好。如果您需要删除非相邻行(或者想要删除重复行而不重新排列文件),则以下Perl单行代码应该可以解决问题(从这里借来):
cat textfile | perl -ne '$H{$_}++ or print'
perl -ne '0==$H{$_}++ or print'
。请注意,它将打印第二次出现的行——也就是第一个重复的行。 - Joel Purra概要
uniq [选项]... [输入文件 [输出文件]]
说明
从输入文件(或标准输入)中仅保留连续的相同行中的一行,并写入输出文件(或标准输出)。
如果您想去掉非相邻重复的行,这个 Perl 片段也可以实现:
while(<>) {
print $_ if (!$seen{$_});
$seen{$_}=1;
}
如果环境不允许使用Perl(我还没有见过这种情况),这里提供了一个awk实现。注意:如果有多个重复的行,则会打印重复的输出。
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;
}'
awk '!c[$0]++' file
。 - glenn jackman如果您想要删除相邻的重复行,请使用uniq
。
如果您想要删除所有重复行,而不仅仅是相邻的行,则需要更加复杂。
这是我在等待答案时想出来的(尽管第一个(并被接受的)答案大约在2分钟内到来)。我在VIM
中使用了这个替换:
%s/^\(.*\)\n\1$/\1/
这意味着:查找在换行符后面与之前相同的行,并仅用我们在第一行捕获的内容替换它们。
uniq
明显更容易实现。