一致するパターンの総数を印刷します。

一致するパターンの総数を印刷します。

私はAPIを使用して約10億のレコードを取得し、フィルタリングしてパイプを介してawkレコードwc -l数を計算します。私は現在これをうまくやっています:

$apiCall | awk '$1=="xx"' | wc -l > file

wc -lただし、AWKコマンドを組み合わせると、次のようにパイプするよりも計算が少なくなります。

$apiCall | awk '$1=="xx" && END{print NR}' > file

しかし、これはうまくいきません。

答え1

以下を見つけることができます。

LC_ALL=C grep -Ec '^[[:blank:]]*xx([[:blank:]]|$)'

awk高度な言語を解釈するオーバーヘッドを防ぐので、はるかに高速です。

LC_ALL=C私たちはテキストの解釈を簡素化するために使用します。これはまた、SPCとTABだけが区切り文字として理解されることを意味しますが、awkこれはロケールに関係なく多くの実装に当てはまります。

GNU / Linux amd64マルチコアシステムのいくつかのタイミングは次のとおりですzsh

$ (repeat 3000 printf '%s\n' {{,xx}{1..1000},xx}" blah blah blah")> a
$ wc a
  6003000  24012000 119412000 a
$ time LC_ALL=C grep -Ec '^[[:blank:]]*xx([[:blank:]]|$)' < a
3000
LC_ALL=C grep -Ec '^[[:blank:]]*xx([[:blank:]]|$)' < a  0.15s user 0.03s system 99% cpu 0.175 total
$ time gawk '$1=="xx"{n++};END{print n}' < a
3000
gawk '$1=="xx"{n++};END{print n}' < a  2.00s user 0.05s system 99% cpu 2.055 total
$ time LC_ALL=C gawk '$1=="xx"{n++};END{print n}' < a
3000
LC_ALL=C gawk '$1=="xx"{n++};END{print n}' < a  1.96s user 0.03s system 99% cpu 1.985 total
$ time mawk '$1=="xx"{n++};END{print n}' < a
3000
mawk '$1=="xx"{n++};END{print n}' < a  1.23s user 0.04s system 99% cpu 1.277 total
$ time gawk '$1=="xx"' < a | wc -l
3000
gawk '$1=="xx"' < a  1.91s user 0.05s system 99% cpu 1.967 total
wc -l  0.00s user 0.00s system 0% cpu 1.967 total

答え2

アイデアは正確ですが、正しい構文はawk次のとおりです。

$apiCall | awk '$1=="xx"{ count++ }END{ print count }'

awkに基づいているため、pattern { action }最初の列のパターンと一致すると、発生するたびにxxカウンターを増やす操作の一部を実行し、ファイルの処理が終わったら句のEND最後の数を印刷します。> file必要に応じて出力を最後にファイルにリダイレクトします。

関連情報