如何逐行grep awk的输出?

时间:2017-10-15 20:39:10

标签: 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   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命令,如果MarkerName

打印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命令的每一行都greptextfile2.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实际上是前一个管道的输出。 (我试图在某种程度上简化这个问题。)这会如何改变答案?

3 个答案:

答案 0 :(得分:3)

awk + grep 解决方案:

dirTest=1
  • grep -f <(awk '$8 >= 11000000{ print $1 }' file1.txt) textfile2.txt > final.txt - 从-f file获取模式,每行一个

答案 1 :(得分:1)

您可以使用 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 撤消其常规活动并打印不匹配模式的所有行。这个开关&#34; inVerts&#34;比赛。

答案 2 :(得分:1)

仅使用 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