如何使用 OR 来匹配两个模式?

如何使用 OR 来匹配两个模式?

我需要使用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。这可以在名称中(因此第七列)或基于出租车,因为有时出现的命名不准确。 ID 是第 6 列。

我的问题是,有时第六列中的 ID 可以与其他列中的值匹配,这些值是不是id。如果我想要SodalisID 的物种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(对于grep),要么只得到 1(对于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.

答案1

这里不需要 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

相关内容