如何将grep的输出作为第二个grep的匹配模式?
用grep+xargs实现将前一个grep的输出作为后一个grep的匹配模式
需求说明
想把第一个grep的输出当作第二个grep的匹配模式使用:先在file1里匹配pattern1,把结果经过sed这类处理后,作为新的匹配模式去file2里查找对应行。试过xargs但只找到替换文件名的例子,想知道能不能用grep+xargs实现,不想用awk方案。
补充示例文件
out_prot.fq
>p1.A2|PDKKMNCP_00148 MDAFELPDTLAQALQRRAAK >p1.A2|PDKKMNCP_00161 MNPEHAQKLARRFVELPLE >p1.A2|PDKKMNCP_00162 MTGTTAARIAKRFVGLSLEQRRQFLSR
p1.A2.tsv
ProtName p1.A2|PDKKMNCP_00163 69.479 557 169 1 103 659 1087 1642 0.0 803 83 ProtName p1.A2|PDKKMNCP_00161 50.707 566 256 10 114 659 51 613 3.31e-170 523 81 ProtName p1.A2|PDKKMNCP_00148 48.522 575 283 2 104 672 1726 2293 1.78e-166 536 85 ProtName p1.A2|PDKKMNCP_00148 46.824 551 281 5 116 659 682 1227 1.76e-142 467 85
之前试过这个命令:
grep $(grep ">" out_prot_test.fq | sed 's/>//') p1.A2.tsv > test
但输出每行开头都带p1.A2.tsv:前缀,想要去掉这个前缀得到目标输出:
ProtName p1.A2|PDKKMNCP_00148 48.522 575 283 2 104 672 1726 2293 1.78e-166 536 85 ProtName p1.A2|PDKKMNCP_00148 46.824 551 281 5 116 659 682 1227 1.76e-142 467 85
解决方案
方案1:grep+xargs实现(纯管道+xargs)
用xargs把处理后的每行模式传递给grep,同时加-h参数去掉文件名前缀:
grep ">" out_prot.fq | sed 's/>//' | xargs -I {} grep -h {} p1.A2.tsv
-I {}:指定占位符,把xargs接收到的每一行内容替换到{}位置,实现每行作为单独的匹配模式-h:让grep不输出匹配到的文件名前缀,正好解决你遇到的前缀问题
方案2:用grep的-f参数(更简洁)
如果不强制要求用xargs,grep自带的-f参数可以直接从标准输入读取模式列表,同样加-h去前缀:
grep ">" out_prot.fq | sed 's/>//' | grep -h -f - p1.A2.tsv
-f -:表示从标准输入(也就是前面管道传过来的内容)读取匹配模式列表-h:去掉文件名前缀
这两种方法都能得到你想要的目标输出,第一种是纯grep+xargs的实现,第二种利用grep自身参数更简洁。
内容的提问来源于stack exchange,提问作者Hek
相关产品推荐
相关产品推荐

