我需要使用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
Run Code Online (Sandbox Code Playgroud)
我需要获取具有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
Run Code Online (Sandbox Code Playgroud)
回报应该是 3,但我得到 2(for grep)或 1(for awk)。我已经试过许多这样的变化||或&甚至:
cat myfile.txt | grep "Sodalis" || cat myfile.txt | awk -F, '$6==2342'
Run Code Online (Sandbox Code Playgroud)
但它给出了答案 1。
我知道我也可以使用 grepgrep -E 'Sodalis|2342'但不幸的是返回 4 因为第二个模式与样本 4 匹配,其中得分值恰好是2342。有没有办法grep根据某个列获得值?我还需要显示整行,因为我想将这些结果另存为一个名为Sodalis.txt.
这里不需要 grep - awk 完全能够匹配模式:
awk -F, '/Sodalis/ || $6==2342' myfile.txt | wc -l
Run Code Online (Sandbox Code Playgroud)
或者
awk -F, '/Sodalis/ || $6==2342 {c++} END{print c}' myfile.txt
Run Code Online (Sandbox Code Playgroud)
(回应评论)如果您只想限制与Sodalis第 7 列的匹配,并且可能从文件中读取每行一个的第 6 列 ID 列表ids.txt:
awk -F, 'NR==FNR{ids[$1]; next} $7 ~ /Sodalis/ || $6 in ids' ids.txt myfile.txt
Run Code Online (Sandbox Code Playgroud)