ファイル内の2つの行が同じかどうかを確認できるUNIXコマンドはありますか?
たとえばファイルを考えるsentences.txt
This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B
文章が
This is sentence X
繰り返されます。
これをすばやく検出できるコマンドはありますか?
$ cat sentences.txt | thecommand
Line 1:This is sentence X
Line 4:This is sentence X
ここにあなたが探している正確な出力を得る一つの方法があります:
$ grep -nFx "$(sort sentences.txt | uniq -d)" sentences.txt
1:This is sentence X
4:This is sentence X
説明:
内部の$(sort sentences.txt | uniq -d)
は、複数回出現する各行をリストします。外側のgrep -nFx
は、sentences.txt
でこれらの行の-x
に完全に一致する-F
を再度探し、行番号-n
を先頭に追加します
希望どおりではありませんが、sort
とuniq -c -d
を組み合わせてみてください。
aularon@aularon-laptop:~$ cat input
This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B
aularon@aularon-laptop:~$ sort input | uniq -cd
2 This is sentence X
aularon@aularon-laptop:~$
2
は、man uniq
からの、行で見つかった重複の数です。
-c, --count
prefix lines by the number of occurrences
-d, --repeated
only print duplicate lines
ファイルの内容がメモリに収まる場合は、awk
が適しています。 comp.lang.awkの標準的なワンライナー(このマシンからインスタンスを検索することはできませんが、毎月いくつかあります)は、重複があることを検出するだけです_awk 'n[$0]++'
_は、各行の値の出現をカウントして出力しますデフォルトアクションが_print $0
_であるため、最初以外の発生.
最初のものを含むすべての出現箇所をフォーマットで表示しますが、複数の値が重複している場合は混合した順序で表示するために、少し厄介です。
_awk <sentences.txt ' !($0 in n) {n[$0]=NR;next} \
n[$0] {n[$0]=0; print "Line "n[$0]":"$0} \
{print "Line "NR":"$0} '
_
わかりやすくするために複数行で示していますが、実際には一緒に実行します。これを頻繁に行う場合は、awk
スクリプトを_awk -f
_を含むファイルに含めるか、もちろんすべてをシェルスクリプトに含めることができます。ほとんどの単純なawk
と同様に、これは_Perl -n[a]
_を使用しても非常に似ています。