Sort -uソートしませんが、より良い一意性を持ちますか? [コピー]

Sort -uソートしませんが、より良い一意性を持ちますか? [コピー]

ファイルを並べ替えたくないので、元の順序を維持しながら重複した行をフィルタリングします。ソート機能なしでソートの独自の機能を使用する方法はありますか(cat -u存在する場合は同様の機能を提供します)。隣接する行だけを表示するのでuniqなくても使用することはsort意味がないので、まずファイルを並べ替える必要があります。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とHashingを使います。

それは次のとおりです。

 #!/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番目のフィールドのみが比較されます(配列の最初のフィールドは0です)。

関連情報