Awk
從特定的 csv 列中 grep 2 個單詞併計算它們
我正在嘗試找到一種更好的方法來完成以下 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 查詢以僅返回我使用 regex 選擇的組。
例如:
Want Need
這篇文章的原因是純粹為了理解在這裡使用正則表達式的更好方法。我知道其他方法可以做到這一點。
聽起來您正在尋找 PCRE
\K
斷言。從perlre:這種結構有一種特殊形式,稱為 \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