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>
。
grep
possible
で始まり、その後に少なくとも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
または、awk
POSIX文字クラスを理解していない場合
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番目の行が上に出力されます。