17

我有一个生成测试和预测输出的工具。这个想法是,如果我失败了,我可以将预测与实际输出进行比较,看看它们在哪里分歧。问题是实际输出包含一些行两次,这使diff. 我想删除重复项,以便我可以轻松比较它们。基本上,类似sort -u但没有排序。

是否有任何 unix 命令行工具可以做到这一点?

4

5 回答 5

24

对答案的补充uniq,如果您不介意sort先检查文件,这将非常有用。如果您需要删除不相邻的行(或者如果您想在不重新排列文件的情况下删除重复项),则应该使用以下 Perl 单行代码(从此处窃取):

cat textfile | perl -ne '$H{$_}++ or print'
于 2009-04-14T08:09:44.867 回答
21

独特的(1)

概要

uniq [选项]... [输入 [输出]]

描述

丢弃来自 INPUT(或标准输入)的所有连续相同行,但写入 OUTPUT(或标准输出)。

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

while(<>) {
    print $_ if (!$seen{$_});
    $seen{$_}=1;
}
于 2009-04-14T07:53:44.890 回答
2

这是一个 awk 实现,以防环境没有/允许 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;
}'
于 2011-07-18T14:09:04.317 回答
1

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

如果要删除所有重复的行,而不仅仅是相邻的行,那就更棘手了。

于 2009-04-14T07:53:52.643 回答
1

这是我在这里等待答案时想到的(尽管第一个(和接受的)答案在大约 2 分钟内出现)。我在VIM

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

这意味着:在换行符之后查找与之前相同的行,并仅将它们替换为我们在第一行中捕获的内容。

uniq不过,肯定更容易。

于 2009-04-14T08:03:12.853 回答