2016-10-18 3 views
0

多くのエントリ(約200.000以上)を含むテキストファイル内に重複行を見つける簡単な方法があるかどうかを知りたいと思います。ソースファイルをそのまま維持します。番号が重複したエントリを持つ行を表示します重複行の検索のためのLinuxコマンドまたはスクリプト

4 
6 
8 
9 

(除く:私は出力がこのような個別のファイルにしたい

1. i got red apple 
2. i got red apple in my stomach 
3. i got green apple 
4. i got red apple 
5. i like blue bananas 
6. i got red apple 
7. i like blues music 
8. i like blue bananas 
9. i like blue bananas 

:たとえば、私はこのようなツイートを持つファイルを得ました重複の最初の出現)。また、一致するパターンはまったく同じ文でなければならないことに注意してください(行1は行2とは異なり、5は7とは異なります)。

私がsort | uniqで見つけることができるものは、文全体の文と一致するようには見えませんが、文章の最初の単語だけが一致するように見えるので、awkスクリプトがこのタスクに適しているかどうか、そうすることができます。

また、2つのファイルからこれらの行を手動で削除したいので、最初のファイルを元のままにしておく必要があります(並べ替えや並べ替えはできません)。最初のファイルにはツイートが入っていて、2番目のハットタグはこれらのツイートのハッシュタグなので、最初のオカレンスを保持して、両方のファイルで重複ツイートを含む行を削除します。

+0

最初のファイルに実際に行番号が含まれていますか、それともイラストレーションのためのものでしょうか? –

+0

@ベンジャミンW。それはありません。私はちょうどソートしてあなたのソリューションを推測する-k 2はありませんか? – lopsi

+0

私の解決策では、行番号がないと仮定し、それらに 'nl'を追加します。 '-k 2 'が必要です。 –

答えて

1

あなたはこのawkを試すことができます。コメントを1として

awk '$0 in a && a[$0]==1{print NR} {a[$0]++}' file 

を、

awk '$0 in a{print NR} {a[$0]++}' file 

出力:

$ awk '$0 in a && a[$0]==1{print NR} {a[$0]++}' file 
4 
8 

$ awk '$0 in a{print NR} {a[$0]++}' file 
4 
6 
8 
9 
+0

ありがとう、それは私が探しているものにかなり近いです。最初に出会っただけでなく、重複した行をすべて印刷する方法はありますか? – lopsi

+0

多分、私はこのコマンドをループし、ファイルから各ループの行を削除することができますが、いつ停止するか分からないでしょう。行を印刷するファイルが空の場合、私は仮定します..しかし、私はこれをどのようにしますか?私はちょうどシェルスクリプトを使い始めています。 – lopsi

+0

@lopsi、アップデートを確認してください。 – sat

0

あなたが同じことを行うためのPythonスクリプトを使用することができます。

f = open("file") 
lines = f.readlines() 
count = len (lines) 
i=0 
ignore = [] 
for i in range(count): 
    if i in ignore: 
     continue 
    for j in range(count): 
     if (j<= i): 
      continue 
     if lines[i] == lines[j]: 
      ignore.append(j) 
      print j+1 

出力:

4 
6 
8 
9 
+0

魅力的な作品です!ありがとう!! – lopsi

+0

Pythonスクリプトを書くと時には多くの時間を節約できます! –

0

ここでは、いくつかのコマンドラインツールを組み合わせた方法であって

nl -n ln file | sort -k 2 | uniq -f 1 --all-repeated=prepend | sed '/^$/{N;d}' | 
cut -f 1 

で調整左この

  • 番号nlとライン、先行ゼロなし(-n ln
  • は、それらをソートします(最初のフィールドを無視します。、行番号)
  • は、最初のフィールドを無視してuniqで重複する行を検出します。重複行の各グループ
  • は、すべての空行を削除し、sed
  • との重複の各グループの最初のものはcut

これがあると行番号以外のすべてを削除する前に、--all-repeated=prependは、空行を追加します

$ nl -n ln file 
1  i got red apple 
2  i got red apple in my stomach 
3  i got green apple 
4  i got red apple 
5  i like blue bananas 
6  i got red apple 
7  i like blues music 
8  i like blue bananas 
9  i like blue bananas 
$ nl -n ln file | sort -k 2 
3  i got green apple 
1  i got red apple 
4  i got red apple 
6  i got red apple 
2  i got red apple in my stomach 
5  i like blue bananas 
8  i like blue bananas 
9  i like blue bananas 
7  i like blues music 
$ nl -n ln file | sort -k 2 | uniq -f 1 --all-repeated=prepend 

1  i got red apple 
4  i got red apple 
6  i got red apple 

5  i like blue bananas 
8  i like blue bananas 
9  i like blue bananas 
$ nl -n ln file | sort -k 2 | uniq -f 1 --all-repeated=prepend | sed '/^$/{N;d}' 
4  i got red apple 
6  i got red apple 
8  i like blue bananas 
9  i like blue bananas 
$ nl -n ln file | sort -k 2 | uniq -f 1 --all-repeated=prepend | sed '/^$/{N;d}' | cut -f 1 
4 
6 
8 
9 
+0

ありがとう、いいアプローチです。データセットのサンプル(1000エントリ)でうまく動作しますが、1.25 milのツイートの大きなデータセットで使用すると、最初に空白行が追加されます。 – lopsi

+0

@lopsiおそらく入力ファイルに空白行があります。あなたの実際の入力がどのように見えるか分かりません。 –

関連する問題