如何逐行grep awk的输出?

如何逐行grep awk的输出?,awk,grep,pipe,Awk,Grep,Pipe,假设我有以下文本文件: $cat file1.txt输出 MarkerName Allele1 Allele2 Freq1 FreqSE P-value Chr Pos rs2326918 a g 0.8510 0.0001 0.5255 6 130881784 rs2439906 c g 0.0316 0.0039 0.8997 10 6870306 rs10760160 a c 0.5289 0.0191 0.8107 9

假设我有以下文本文件:

$cat file1.txt
输出

MarkerName  Allele1 Allele2 Freq1   FreqSE  P-value Chr Pos
rs2326918   a   g   0.8510  0.0001  0.5255  6   130881784
rs2439906   c   g   0.0316  0.0039  0.8997  10  6870306
rs10760160  a   c   0.5289  0.0191  0.8107  9   123043147
rs977590    a   g   0.9354  0.0023  0.8757  7   34415290
rs17278013  t   g   0.7498  0.0067  0.3595  14  24783304
rs7852050   a   g   0.8814  0.0006  0.7671  9   9151167
rs7323548   a   g   0.0432  0.0032  0.4555  13  112320879
rs12364336  a   g   0.8720  0.0015  0.4542  11  99515186
rs12562373  a   g   0.7548  0.0020  0.6151  1   164634379
这是一个awk命令,如果
Pos>=11000000

$  awk '{ if($8 >= 11000000) { print $1 }}' file1.txt 
此命令输出以下内容:

MarkerName
rs2326918
rs10760160
rs977590
rs17278013
rs7323548
rs12364336
rs12562373
问题:我想将其输入到
grep
语句中,以解析另一个文本文件
textfile2.txt
。不知何故,可以将上一个
awk
命令的输出导入
grep AWKOUTPUT textfile2.txt

我希望上面的awk命令的每一行都与
textfile2.txt
对应,即

grep "rs2326918" textfile2.txt
## and then 
grep "rs10760160" textfile2.txt
### and then 
...
当然,我会将
textfile2.txt
中的所有结果行保存到最终文件中,即

$ awk '{ if($8 >= 11000000) { print $1 }}' file1.txt | grep PIPE_OUTPUT_BY_ROW textfile2.txt > final.txt
如何从管道中逐行执行
grep


编辑:为了澄清,我有一个限制,那就是
file1.txt
实际上是前一个管道的输出。(我试图把问题简化一些。)这会如何改变答案

您可以使用bash执行以下操作:

bash-3.1$ echo "rs2326918" > filename2.txt
bash-3.1$ (for i in `awk '{ if($8 >= 11000000) { print $1 }}' file1.txt  |
    grep -v MarkerName`; do grep $i filename2.txt; done)  > final.txt
bash-3.1$ cat final.txt
rs2326918
或者

bash-3.1$ cat file1.txt | (for i in `awk '{ if($8 >= 11000000) { print $1 }}' |
    grep -v MarkerName`; do grep $i filename2.txt; done)  > final.txt

开关
grep-v
告诉grep反转其通常的活动,并打印所有与模式不匹配的行。此开关“反转”匹配。

awk+grep解决方案:

grep -f <(awk '$8 >= 11000000{ print $1 }' file1.txt) textfile2.txt > final.txt
grep-f final.txt

  • -f文件
    -从
    文件
    中获取图案,每行一个

只有使用awk才能为您做到这一点:

$ awk 'NR>1 && NR==FNR {if ($8 >= 110000000) a[$1]++;next} \
   { for(i in a){if($0~i) print}}' file1.txt file2.txt> final.txt

我的一个限制是
file1.txt
实际上是前一个管道的输出。(我试着简化一下问题。)这会如何改变答案?@ShanZhengYang,在改变答案之前,应该有人改变这个问题。我的一个限制条件是,
file1.txt
实际上是以前管道的输出。(我试图简化这个问题。)这将如何改变答案?为了从
awk
中获得管道输出,似乎这可以工作:`PIPE | awk'NR==FNR&$8>=110000000{a[$1]++;next}\{for(I in a)if(I~$0)print}'file2.txt>final.txt`我的一个约束条件是
file1.txt
实际上是前一个管道的输出。(我试图简化这个问题。)这将如何改变答案呢?
()
中的部分是一个子流程,因此您可以从上面删除
file1.txt
,然后直接转到
(for…
)。您能解释一下为什么要使用
grep-v MarkerName
?这将有助于像我这样的学习者。谢谢你的帮助!不推荐使用的backticks、UUOC、非惯用awk语法、不带引号的变量、不必要的命令和管道等。您的问题非常不清楚,但清楚的是,您目前接受的答案肯定不是如何做任何事情。如果您需要帮助,那么您的问题将澄清您的需求,并提供简洁、可测试的示例输入和预期输出。