特定のcsv列から2つの単語をgrepし、数を数えます。

特定のcsv列から2つの単語をgrepし、数を数えます。

次の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

また、見ることができます前方と後方の長さがゼロのアサーション

おすすめ記事