ファイル内で繰り返される部分文字列の検索

ファイル内で繰り返される部分文字列の検索

possible与えられた入力ファイルからパターンで始まる文字列が繰り返し表示されることを検索したいと思います。

  • 入力例:
    this is the best possible solution
    possible1234 solution!!!
    possible5678 solution!!!
    possible5678 solution!!!
    possible0000 solution!
    possible0000 solution!
    There should be some "possible7777" solution!
    There should be some "possible7777" solution!
    
  • 希望の出力:
    possible5678 solution!!!
    possible0000 solution!
    There should be some "possible7777" solution!
    
    possibleNNNNこれは、ファイル内で複数回発生するパターンマッチングであるためです。

答え1

これは特定の問題に対する考えられる解決策を提供する。質問に対するさまざまな修正:

<your-file grep '^possible[[:digit:]]' | sort | uniq -d

で始まる重複行を語彙的にソートしたリストを提供しますpossible<digit>

  • greppossibleで始まり、その後に少なくとも1つの数字が続く行を選択します。
  • sort重複した項目が隣接するように結果を並べ替えます(必須uniq)。
  • uniq -d重複として報告されました。

GNUの実装または互換性をpossible<digits>想定して入力内のすべての項目を一致させるには、次の手順を実行します。grep

<your-file grep -Po 'possible\d+' | sort | uniq -d

次のように入力すると:

おそらく123私はxxですおそらく123うん

これにより、以下が提供されます。

possible123

重複エントリを含むすべての一意の行の場合possible<digit>

perl -lne 'if (/possible(\d+)/) {
             $count{$1}++;
             $lines{$1}->{$_}++;
           }
           END{
             for $k (grep {$count{$_} > 1} keys %count) {
               print for keys %{$lines{$k}}
             }
           }' < your-file

次のように入力すると:

this is the best possible solution
possible1234 solution!!!
possible5678 solution!!!
possible5678 solution!!!
possible0000 solution!
impossible0000 other solution!

それは以下を提供します:

possible0000 solution!
impossible0000 other solution!
possible5678 solution!!!

(与えられた行が互いに隣にあること以外は定義されpossibleXXXXた順序はありません)。

答え2

修正された例の場合awk- ベースのソリューションが機能します。

awk '/possible[[:digit:]]+/ {count[$0]++;} END{for (line in count) {if (count[line]>1) print line}}' input.txt 

または、awkPOSIX文字クラスを理解していない場合

awk '/possible[0-9]+/ {count[$0]++;} END{for (line in count) {if (count[line]>1) print line}}' input.txt 

possible各行にパターンと少なくとも1つの数字が含まれていることを確認してください。見つかると、発生カウンタが増加します。全行について。最後に、発生カウンタが1より大きい行のみを印刷します。

これは実際の入力が表示されている場合にのみ機能します。異なる行が同じパターンを持つことができる場合possibleNNNN、それは失敗です!

答え3

次の方法を使用して、重複行の順序を維持できます。

環境変数 "re" に正規表現を格納し、match コマンドを使用して正規表現行を検索します。この行では、gsubコマンドを使用して、この時点で見ている正規表現の数を更新しました。

$ re='\<possible[0-9]+\>' \
awk  'BEGIN { r = ENVIRON["re"] }
match($0, r) && 
(a[substr($0,RSTART,RLENGTH)] += gsub(r, "&")) == 2'  logfile

Perlの1行のコードは次のとおりです。

perl -lne 'print if /\bpossible(\d+)\b/ && 2 == ($h{$1} +=()= //g)' logfile

答え4

\<GNU awkを使用して、単語の境界、\w略語、およびmatch()の3番目の引数を表します。

$ awk 'match($0,/\<possible\w*/,a) && ++cnt[a[0]]==2' file
possible5678 solution!!!
possible0000 solution!
There should be some "possible7777" solution!

重複キーでどの行を出力するかは言わなかったので、2番目の行が上に出力されます。

関連情報