非常に大きなファイル内の繰り返しパターンaa
の数を数えたい。したがって、次のコマンドを使用します。
grep -o "aa" ./bwt/dblp.txt | wc -l
これは、aaa
などの文字列があり、これが1つのパターンとしてのみ一致する場合を除いて機能します。私のユースケースでは、最初の2つのa
sが1つのパターンを意味する必要がありますが、最後の2つのa
sは2番目のパターンです(これは、a
の中央のaaa
を再利用できることを意味します)。
どうすればこれを達成できますか?
ファイルは非常に大きいので、可能であれば「最適化された」方法の方がよいことに注意してください。とにかく、どんな実用的な解決策も明らかに歓迎されています。
これにはPerlの正規表現が必要です。 -P
フラグをサポートするgrep
の場合:
grep -oP '(?<=a)a' file | wc -l
これはポジティブです lookbehind 。これは、別のa
が前に付いている単一のa
と一致します。
Perl
を使用する場合(またはgrep
が-P
フラグをサポートしていない場合):
Perl -ne 'while(m/(?<=a)a/g){$a++}END{print "$a\n"}' file
例:
$ cat file
aa
aaa
aaaa
最初の行は1つの一致、2番目の行は2つ、3番目の行はツリーである必要があります。すべて一緒に6:
$ grep -oP '(?<=a)a' file | wc -l
6
次のように、データファイルbig_file
内の例aa
のような繰り返される文字のペアを数えることができます。
tr -cs a '\012' <big_file | awk '/aa/{n += length - 1}; END {print n+0}'
線はこのように説明することができます
tr
は、a
以外の文字のシーケンスを改行に変更します。これにより、aa...
の複数のオカレンスが別々の行に分割されますawk
は、ゼロ以外の行の長さをカウントします。 N文字のシーケンスにN-1個の重複するペアが含まれるというプロパティを使用することにより、重複するペアの数を合計し、ファイルの最後に合計を生成できます。実際、ファイルは「非常に大きい」ので、次のようにパイプラインにgrep
を含めるとより良い応答が得られます。
tr -cs a '\012' <big_file | grep aa | awk '{n += length - 1}; END {print n+0}'