Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何从文件中删除重复行_Unix_Command Line_Duplicates - Fatal编程技术网

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

Unix 如何从文件中删除重复行,unix,command-line,duplicates,Unix,Command Line,Duplicates,我有一个生成测试和预测输出的工具。这个想法是,如果我失败了,我可以将预测与实际输出进行比较,看看它们的分歧在哪里。问题是实际输出包含两行,这会混淆diff。我想删除重复项,以便比较它们。基本上,类似于sort-u但没有排序 有任何unix命令行工具可以做到这一点吗? 概要 uniq[选项]。。。[输入[输出]] 描述 丢弃输入(或标准输入)、写入输出(或标准输出)中的所有连续相同行,只有一行除外 或者,如果您还想删除非相邻的重复行,这个perl片段可以做到: while(<>) {

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

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

概要

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

描述

丢弃输入(或标准输入)、写入输出(或标准输出)中的所有连续相同行,只有一行除外

或者,如果您还想删除非相邻的重复行,这个perl片段可以做到:

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

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


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

这是我在这里等待答案时想到的(尽管第一个(被接受的)答案大约在2分钟后出现)。我在
VIM
中使用了此替换:

%s/^\(.*\)\n\1$/\1/
这意味着:寻找换行后与之前相同的行,并仅用我们在第一行中捕获的内容替换它们


uniq
显然更简单。

是对
uniq
答案的补充,如果您不介意先对文件进行排序的话,这非常有效。如果需要删除非相邻行(或者如果希望在不重新排列文件的情况下删除重复行),则应使用以下Perl one liner(从中窃取):


这里是一个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;
}'

我认为这是一个简洁的答案。现在已经用Perl编程6年了,不会想到这么简洁的东西Perl部分真的很漂亮。然而,这确实有资格获得“猫的无用使用”奖:-)(见)。使用“我从来没听说过这个奖项!是的,我确实有时会无偿地使用cat;我不知道为什么在我看来“cat x |”比“y”有关“让我的眼睛流血:猫的无猫使用奖!”!使用perl-ne…无论什么。。。textfile根据@MattJ的回答,仅从未排序的输入中获取非唯一行:
perl-ne'0==$H{$\u}++或print'
。请注意,它将打印第二个匹配项,即第一个重复项。Perl答案仅在需要第一项时有效。最后一个是不同的解决方案。对于那些不知道如何使用Perl的人,您只需键入以下内容:Perl-pe'print,除非$seen{$}++'[INPUT]>OUTPUT@Xetuis,它们是同一行:)如果您想要最后一行,只需将SEED条目设置为行号,不要在循环中打印,然后,按行号的顺序在末尾打印出来。但我不认为在这种情况下需要这样做。@reinierpost,是的,我永远也记不起执行此操作的命令行选项,所以我倾向于使用完整的脚本……如果您只是将整行代码视为关键,这类似于perl解决方案:
awk'!c[$0]+'文件
可能存在的副本
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;
}'