Bash

如何使用 OR 匹配兩個模式?

  • July 26, 2021

我需要使用grepandawk來匹配兩種類型的模式,但我無法弄清楚語法。

我的文件具有以下值:

sample1,gicode1,123,4541,221,3661,Sodalis sp.1
sample2,gicode1,123,0322,12,112342,Sodalis sp.2
sample3,gicode1,112,4541,00,2342,Candidatus sp.
sample4,gicode1,2341,4541,00,9606,Homo sapiens

我需要獲取具有Sodalis. 這可以在名稱中(所以第 7 列)或基於計程車,因為有時出現的命名不准確。ID 是第 6 列。

我的問題是,有時第 6 列中的 ID 可以與其他ID 列中的值匹配。如果我想要Sodalis具有 ID 的物種2342,它會在樣本 3 中正確顯示,但它也是樣本 4(第 3 列)中的評分值。

awk -F, '$6==2342'我可以使用或僅使用名稱來獲取正確列中的 ID,grep 'Sodalis'但我遇到了將兩者結合起來的問題,如下所示:

cat myfile.txt | grep "Sodalis" OR awk -F, '$6==2342' | wc -l

返回應該是 3,但我得到 2(for grep)或只有 1(for awk)。我已經嘗試了很多變體,||甚至&

cat myfile.txt | grep "Sodalis" || cat myfile.txt | awk -F, '$6==2342'

但它給出了答案 1。

我知道 grep 我也可以使用grep -E 'Sodalis|2342',但不幸的是返回 4 因為第二個模式與樣本 4 匹配,它的得分值恰好是2342. 有沒有辦法grep根據某個列來獲取值?我還需要顯示整行,因為我想將這些結果保存為一個名為Sodalis.txt.

這裡不需要 grep - awk 完全能夠匹配模式:

awk -F, '/Sodalis/ || $6==2342' myfile.txt | wc -l

或者

awk -F, '/Sodalis/ || $6==2342 {c++} END{print c}' myfile.txt

(回應評論)如果您只想將匹配限制Sodalis為第 7 列,並且可能從文件中每行讀取一個第 6 列 ID 的列表ids.txt

awk -F, 'NR==FNR{ids[$1]; next} $7 ~ /Sodalis/ || $6 in ids' ids.txt myfile.txt

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