Awk

從特定的 csv 列中 grep 2 個單詞併計算它們

  • August 26, 2021

我正在嘗試找到一種更好的方法來完成以下 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

參見Lookahead 和 Lookbehind 零長度斷言

引用自:https://unix.stackexchange.com/questions/666201