我们说我有以下文本文件:
$ 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命令的每一行都grep
对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
实际上是前一个管道的输出。 (我试图在某种程度上简化这个问题。)这会如何改变答案?
答案 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