次のgrep / awkクエリを完了するためのより良い方法を見つけようとしています。以下は問題の簡単な例です。
私は正規表現を使ってこれを達成しました。
grep -Po ^(?:[^,]+,\s?){7}(Want|Need) | awk -F ',' 'NR>=2{print $8}' | sort | uniq -c
私のCSVファイルは次のとおりです。
1896,Ranger,2021,State,Postcode,Surname,Industry,Want,Turbo,Good
1896,Ranger,2021,State,Postcode,Surname,Industry,Selling,Turbo,Good
1896,Ranger,2021,State,Postcode,Surname,Industry,Need,Turbo,Good
上記のジョブはgrepを使用して行全体を印刷します。
1896,Ranger,2021,State,Postcode,Surname,Industry,Want
1896,Ranger,2021,State,Postcode,Surname,Industry,Need
その後、列8の値を計算できます。私の質問は、正規表現を使用して選択したグループのみを返すようにgrep / regexクエリを作成する方法です。
たとえば、
Want
Need
この記事を書いた理由は、純粋にここで正規表現を使用するより良い方法を理解するためです。私はこれを行う他の方法があることを知っています。
ベストアンサー1
PCREアサーションを探しているようです\K
。 ~からフェレ:
\K(Perl 5.10.0以降で利用可能)という特別な形式のこの構成があり、これは正規表現エンジンが$&で囲まれず、\K以前に一致する項目を「保持」するようにします。
だから
$ grep -Po '^(?:[^,]+,\s?){7}\K(Want|Need)' file.csv
Want
Need
より一般的には、この種の操作は次のように行われます。後ろを見て主張 - しかし、Perlは可変長の振り返りをサポートせず、grep -Pもサポートしません。
$ grep -Po '^(?<=(?:[^,]+,\s?){7})(Want|Need)' file.csv
grep: lookbehind assertion is not fixed length
また、見ることができます前方と後方の長さがゼロのアサーション