データをソートせずに一意の結果のみを取得する方法は?

データをソートせずに一意の結果のみを取得する方法は?
$ cat data.txt 
aaaaaa
aaaaaa
cccccc
aaaaaa
aaaaaa
bbbbbb
$ cat data.txt | uniq
aaaaaa
cccccc
aaaaaa
bbbbbb
$ cat data.txt | sort | uniq
aaaaaa
bbbbbb
cccccc
$

私が必要とする結果は元のファイルのすべての行を表示し、ファイルの元のステートメントの順序を維持しながら、すべての重複項目(連続行だけでなく)を削除します。

この例では、私が実際に探している結果は次のとおりです。

aaaaaa
cccccc
bbbbbb

一般に、この一般的なタスクをどのように実行しますかuniq

答え1

perl -ne 'print unless $seen{$_}++' data.txt

または必ず持っている必要がある場合役に立たない使用cat:

cat data.txt | perl -ne 'print unless $seen{$_}++'

以下はawkPerlのないシステムの翻訳です:

awk '!seen[$0]++' data.txt
cat data.txt | awk '!seen[$0]++'

答え2

次のツールがありますunique

usr@srv % cat data.txt | unique out
usr@srv % cat out
aaaaaa
cccccc
bbbbbb

他のツールを使用せずに単一のコマンドラインで同じ目標を達成することは、より複雑です。

usr@srv % cat data.txt | nl | sort -k 2 | uniq -f 1 | sort -n | sed 's/\s*[0-9]\+\s\+//'
aaaaaa
cccccc
bbbbbb

nlsort行の前に行番号を印刷するので、行の後に/がある場合は、行の元のuniq順序を復元できます。sed後ろの行番号を削除してください。 ;)

答え3

私はこれを使用することを好みます:

cat -n data.txt | sort --key=2.1 -b -u | sort -n | cut -c8-

cat -n行番号を追加し、

sort --key=2.1 -b -u2番目のフィールド(追加の行番号の後ろ)に基づいて並べ替え、先行スペースを無視して一意の行を保持します。

sort -n厳密な数値順に並べ替え

cut -c8-列8からEOLまでのすべての文字を保持します(つまり、含まれる行番号を省略)。

答え4

使用幸せ(以前のPerl_6)

~$ raku -e '.put for lines.unique;'  file

以上awk-類似の構文):

~$ raku -ne 'state %h; .put unless %h{$_}++ ;'  file

入力例:

aaaaaa
aaaaaa
cccccc
aaaaaa
aaaaaa
bbbbbb

出力例:

aaaaaa
cccccc
bbbbbb

https://docs.raku.org
https://raku.org

関連情報