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


24

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

回答:


40

探している正確な出力を取得する1つの方法を次に示します。

$ 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


あなたの編集は、まったく同じ答えを投稿することで私をかろうじて打ち負かしました。+1
ケーシー14

それで、$(コマンド)構文は一種の置換として機能しますか?
CodeBlue 14

2
@CodeBlue-はい。それは呼ばれていますコマンド置換
grebneke

8
sort sentences.txt | uniq -d | grep -nFxf - sentences.txt少し効率的で、潜在的なarg list too long問題を回避できます。
ステファンシャゼル14

10

正確に何をしたいが、あなたの組み合わせ試すことができない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

6

ファイルの内容がメモリに収まる場合、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]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.