したがって、最後に単語がある一連の数字を含むテキストファイルがあります。
123456 126 2 12456 1256 4 46 12346 123456 4 56 word
24 245 1234 356 12346 6 3 346 245 5 12346 12356 word
8つ以上の文字列(1つ、6つ、またはその両方を含む)を含むすべての行を見つけたいです。したがって、最初の行には、1、6、またはその両方を含む8つの文字列(スペースで区切られている)があるため、渡されます。 2番目には、1、6、またはその両方を含む7つの文字列のみがあります。
次の正規表現を試しましたが、逆追跡制限エラーが発生します。([0-9]*(1|6)[0-9]* .*){8,}
ベストアンサー1
1
正規表現を作成する代わりに、次のコードは最後のフィールドを除いてスペースで区切られたすべてのフィールドを繰り返し、またはが含まれている場合はカウンタをインクリメントします6
。カウンタ値が8以上の場合、現在のレコードが出力されます。
awk '{ count = 0; for (i = 1; i < NF; ++i) count += ($i ~ "[16]") }; count >= 8' file
次のコードは同じことを行いますが、レコードを出力したい場合は計算を停止します。
awk '{ count = 0; for (i = 1; i < NF && count < 8; ++i) count += ($i ~ "[16]") }; count == 8' file
短い(読み取れない)行(カウンタが実行中です)。下に8)から:
awk '{c=8;for(i=1;i<NF&&c;++i)c-=$i~"[16]"}!c' file