web-dev-qa-db-ja.com

ファイル内の2つの行が同じかどうかを確認するUnixコマンド?

ファイル内の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
24
CodeBlue

ここにあなたが探している正確な出力を得る一つの方法があります:

$ 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を先頭に追加します

40
grebneke

希望どおりではありませんが、sortuniq -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
10
aularon

ファイルの内容がメモリに収まる場合は、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]_を使用しても非常に似ています。

6