我不想对文件进行排序,只需过滤掉重复的行,保持原始顺序。有没有办法在没有排序功能的情况下使用排序的独特功能(cat -u
如果存在的话会给出类似的东西)?仅使用uniq
withoutsort
没有任何价值,因为uniq
只查看相邻行,因此必须首先对文件进行排序。
uniq
另外,顺便说一句,和之间到底有什么区别uniq --unique
?以下是来自 Pastebin 的随机文件的命令:
wget -qO - http://pastebin.com/0cSPs9LR | wc -l
350
wget -qO - http://pastebin.com/0cSPs9LR | sort -u | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq -u | wc -l
258
总之:
- 如何在不排序的情况下贪婪地过滤重复项?
- 怎么
uniq
还不够独特呢uniq --unique
?
ps 这个问题看起来像是以下问题的重复,但事实并非如此:
答案1
我会使用 perl 和哈希。
就像是:
#!/usr/bin/perl
use strict;
use warnings;
my %seen;
while ( <> ) {
print unless $seen{$_}++;
}
我认为这可以简单地理解为:
perl -ne 'print unless $seen{$_}++' data.txt
(或者猫数据进入其中)。
这适用于获取唯一的整行 - 您还可以使用拆分或正则表达式来比较子集。
例如
while ( <> ) {
my @fields = split ( ";" );
print unless $seen{$fields[4]}++;
}
将根据 将该行拆分为字段;
,并仅比较第 5 个字段(数组中第一个字段为零)。