Bash
如何使用 OR 匹配兩個模式?
我需要使用
grep
andawk
來匹配兩種類型的模式,但我無法弄清楚語法。我的文件具有以下值:
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(forawk
)。我已經嘗試了很多變體,||
甚至&
: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