Sort -u 不排序但具有更好的唯一性?

Sort -u 不排序但具有更好的唯一性?

我不想对文件进行排序,只需过滤掉重复的行,保持原始顺序。有没有办法在没有排序功能的情况下使用排序的独特功能(cat -u如果存在的话会给出类似的东西)?仅使用uniqwithoutsort没有任何价值,因为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

总之:

  1. 如何在不排序的情况下贪婪地过滤重复项?
  2. 怎么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 个字段(数组中第一个字段为零)。

相关内容