我想使用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
3条答案
按热度按时间a1o7rhls1#
在我看来很简单:
$(...)
是标准的替换。在某些情况下,你可能需要用反勾号(重音符号坟墓)来替换它,但这些在网站上很难显示。我不知道你在评论中的意思:我有两个文件,
file1
(“entry”)和file2
(“entry2”),当我启动grep $(grep "entry" file1) file2
时,我只看到“entry2”。但是当我启动
grep $(grep "entry" file1) file*
时,我也看到了文件名(“file1:entry”和“file2:entry2”),这是您所指的吗?vwoqyblh2#
你有例子吗?
我会做这样的事情:
uoifb46i3#
使用Bash的
cmd2 $(cmd1)
语法将一个命令的输出作为另一个命令的参数。