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