You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:24:29