unix 使用grep输出作为第二个grep的模式

hwamh0ep  于 2023-03-02  发布在  Unix
关注(0)|答案(3)|浏览(258)

我想使用grep命令的输出作为第二个grep中的pattern参数。

grep "pattern1" file1 | grep [output of previous grep] file2

期望的行为是在file 1中查找具有模式的行,然后在file 2中查找也具有该模式的行(我不直接在file 2中搜索模式的原因是我在两个grep之间执行了其他操作,如sed)。
我认为这对于xargs应该是可能的,但是我只能找到使用第一个grep的输出代替 * file 2 * 的示例,而不是代替 pattern 参数的示例。

在编写这个线程时,我注意到有一个similar question from five years ago with solutions using awk。如果需要,我可能会使用这些解决方案,但我很想知道grep和xargs是否可以这样做。
编辑以下是一些示例文件。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

我现在已经按照@Dominique和@david-grayson的建议尝试了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
p1.A2.tsv:ProtName p1.A2|PDKKMNCP_00148 46.824 551 281 5 116 659 682 1227 1.76e-142 467 85

这几乎就是我想要的,除了附加到文件内容的第二个文件名(p1.A2.tsv:在每一行的开头)。我可以再次用sed修剪它,但可能在某些情况下这是不可能的。有什么方法可以完全防止它出现吗?
我想要的:

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
a1o7rhls

a1o7rhls1#

在我看来很简单:

grep $(grep "entry1" file1) file2

$(...)是标准的替换。在某些情况下,你可能需要用反勾号(重音符号坟墓)来替换它,但这些在网站上很难显示。
我不知道你在评论中的意思:我有两个文件,file1(“entry”)和file2(“entry2”),当我启动grep $(grep "entry" file1) file2时,我只看到“entry2”。
但是当我启动grep $(grep "entry" file1) file*时,我也看到了文件名(“file1:entry”和“file2:entry2”),这是您所指的吗?

vwoqyblh

vwoqyblh2#

你有例子吗?
我会做这样的事情:

grep "pattern1" file1 | xargs grep -f - file2
uoifb46i

uoifb46i3#

使用Bash的cmd2 $(cmd1)语法将一个命令的输出作为另一个命令的参数。

相关问题