特定のテキスト(TY [0-9]など)の発生回数を計算したい10 GBのファイルがあります。
サンプルファイル:
ABC,2A,2018-07-06,2018-06-20 00:00:00
BCD,TY1,2018-07-06,2018-06-20 00:00:00
EFG,TY2,2018-07-06,2018-06-20 00:00:00
IGH,2A,2018-07-06,2018-06-20 00:00:00
TY
数字で始まるすべてのテキストの数を取得したいです。 egrepを使ってみましたが、正しい結果が得られませんでした。
egrep "^TY[0-9]" Filename
答え1
試した解決策の主な問題は、TY
文字列の先頭(表現式を固定する位置^
)で突き出る音が発生すると仮定することです。 2番目のカンマ区切りフィールドの先頭に表示されます。
awk
ファイル内の2番目のカンマ区切りフィールドが文字列と数字で始まる回数を計算するために使用されますTY
。
awk -F, '$2 ~ /^TY[[:digit:]]/ { n++ } END { print n }' filename
cut
と一緒に使用する方が速いのではないかと思いますgrep
。 2番目の列を削除すると、処理するデータが少なくなるため、単独で実行するよりも速度が速くなりますgrep
。grep
cut -d, -f2 filename | grep -c '^TY[[:digit:]]'
…でもよく分からない。
私のOpenBSDシステムで1.1GBファイルでいくつかのテストを行った結果、+は実際にはcut
(8秒対15秒)よりもgrep
ほぼ50%速かったです。awk
そして純粋なgrep
溶液(grep -Ec '\<TY[0-9]' filename
、からインポートグレンのソリューション)13秒かかります。
したがって、2番目のフィールドで文字列を選択した場合は、一致する前にそのフィールドを抽出することで時間を節約できます。
答え2
行開始アンカーの代わりに単語の境界を使用したいと思います。
$ grep -Ec '\<TY[0-9]' file
2
注:これはすべて重要です。ワイヤー「TY」で。すべての「TY語」の数ではありません。 1行に2つ以上ある場合
$ grep -Eo '\<TY[0-9]' file | wc -l
答え3
,
TY
任意の小数点以下の桁数で始まり、その後にその数字が続く区切りフィールドを見つけるには、次のようにします。
<file perl -lne '$n += () = /(?<![^,])TY\d+(?![^,])/g; END{print 0+$n}'
次のように入力します。
TY1,TY2,TY,TYFOO
TY213,X-TY2,TY4
4
(TY1
、、、、、TY2
)TY213
を返しますTY4
。
(?<!...)
そして(?!...)
それぞれ負の振り返りとプレビュー演算子です。したがって、ここでは、前後に例外文字がない場合、1つTY
以上の(+
)数字()の後に1つ以上の()数字()が続くことを探します。\d
,
別のアプローチは、sを改行文字に変換し、1つ以上の数字で始まる結果行の,
数を計算することです。TY
<file tr , '\n' | LC_ALL=C grep -xEc 'TY[[:digit:]]+'
(私のシステムではこれがソリューションの約10倍ですperl
)