特定の開始文字を含む値の Grep 範囲

特定の開始文字を含む値の Grep 範囲

特定のテキスト(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番目の列を削除すると、処理するデータが少なくなるため、単独で実行するよりも速度が速くなりますgrepgrep

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

4TY1、、、、、TY2TY213を返しますTY4

(?<!...)そして(?!...)それぞれ負の振り返りとプレビュー演算子です。したがって、ここでは、前後に例外文字がない場合、1つTY以上の(+)数字()の後に1つ以上の()数字()が続くことを探します。\d,

別のアプローチは、sを改行文字に変換し、1つ以上の数字で始まる結果行の,数を計算することです。TY

<file tr , '\n' | LC_ALL=C grep -xEc 'TY[[:digit:]]+'

(私のシステムではこれがソリューションの約10倍ですperl

関連情報