1行にスペースがなく、他の行もないテキストデータがたくさんあります。実際の流れは0.2Gb/sです。ここただし、この操作では、発生回数を計算するのが空行を計算するよりも困難です。ゲームは
585e0000fe5a1eda480000000d00030007000000cd010000
サンプルデータのサブセットは次のとおりです。ここと言う2015.6.30_data.txt完全なバイナリデータここと言う0002.生。試合は1回発生しました。2015.6.30_data.txtしかし、データ全体では10倍です。0002.生一行に。経由でtxtデータを準備しましたxxd -ps 0002.raw > /tmp/1 && fold -w2 /tmp/1 > /tmp/2 && gsed ':a;N;$!ba;s/\n//g' /tmp/2 > /tmp/3
。実装は速いほど良いです。列に大きな文字列を準備するには、これを使用できますxxd -ps 0002.raw > /tmp/1 && fold -w2 /tmp/1 > /tmp/2
。現在の速度はゲームあたり0.0012秒です。これはデータファイル全体で10ゲームあたり0.012秒なので遅いです。
Grepはこれを行ごとに実行するため、カウントできません。 Vimでは、%s/veryLongThing//gn
作業を完了するだけでは十分ではありません。このコマンドはwc
文字、バイト、行のみを提供するので、適切なツールではありませんが、他のものと組み合わせることは可能です。それはおそらくGNU FindとSedの組み合わせでしょう。しかし、すべての実装が複雑すぎるようです。
Mikeservの返信結果
$ cat 1.7.2015.sh
time \
( export ggrep="$(printf '^ \376Z\36\332H \r \3 \a \315\1')" \
gtr='\1\3\a\r\36HZ^\315\332\376'
LC_ALL=C
gtr -cs "$gtr" ' [\n*]' |
gcut -sd\ -f1-6 |
ggrep -xFc "$ggrep"
) <0002.raw
$ sh 1.7.2015.sh
1
real 0m0.009s
user 0m0.006s
sys 0m0.007s
-----------
$ cat 1.7.2015.sh
time \
( set x58 x5e x20 x20 xfe x5a x1e xda \
x48 x20 x20 x20 x0d x20 x03 x20 \
x07 x20 x20 x20 xcd x01 x20 x20
export ggrep="$(shift;IFS=\\;printf "\\$*")" \
gtr='\0\1\3\a\r\36HXZ^\315\332\376' \
LC_ALL=C i=0
while [ "$((i+=1))" -lt 1000 ]
do gcat 0002.raw; done |
gtr -cd "$gtr" |gtr 'X\0' '\n ' |
gcut -c-23 |ggrep -xFc "$ggrep"
)
$ sh 1.7.2015.sh
9990
real 0m4.371s
user 0m1.548s
sys 0m2.167s
すべてのツールはGNU coreutilsであり、コードに提供するすべてのオプションがあります。ただし、GNU devtoolsとは異なる場合があります。 Mikeservはコードを990回実行し、10のイベントを持つため、合計9990のイベントが正確です。
スーパー文字列の一致数を効率的に計算するには?
ベストアンサー1
GNUの実装grep
(最新バージョンは完全な(ほとんど互換性のある)書き換えですが、ほとんどの最新のBSDにもあります)は-o
出力オプションをサポートします。みんな一致する部品。
LC_ALL=C grep -ao CDA | wc -l
これにより、すべての発生回数が計算されます。
LC_ALL=C grep -abo CDA
バイトオフセットで探します。
LC_ALL=C
grep
高価なUTF-8解析を試みないでください(固定ASCII文字列検索では、grep
独自にUTF-8解析を最適化できるはずですが)。バイナリについて考えるように-a
言うのは別のGNUismです。grep