$ 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{$_}++'
以下はawk
Perlのないシステムの翻訳です:
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
nl
sort
行の前に行番号を印刷するので、行の後に/がある場合は、行の元のuniq
順序を復元できます。sed
後ろの行番号を削除してください。 ;)
答え3
私はこれを使用することを好みます:
cat -n data.txt | sort --key=2.1 -b -u | sort -n | cut -c8-
cat -n
行番号を追加し、
sort --key=2.1 -b -u
2番目のフィールド(追加の行番号の後ろ)に基づいて並べ替え、先行スペースを無視して一意の行を保持します。
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