【问题标题】:How to grep the outputs of awk, line by line?如何逐行 grep awk 的输出?
【发布时间】:2018-03-27 08:25:58
【问题描述】:

假设我有以下文本文件:

$ 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 则打印 MarkerName

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

【问题讨论】:

  • 您的问题非常不清楚,但很清楚的是,您当前接受的答案绝对不是如何做任何事情。如果您需要帮助,请edit您的问题以阐明您的要求并提供简洁、可测试的示例输入和预期输出。

标签: awk grep pipe


【解决方案1】:

awk + grep 解决方案:

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

  • -f file - 从file 获取模式,每行一个

【讨论】:

  • 我有一个约束是 file1.txt 实际上是前一个管道的输出。 (我试图在某种程度上简化这个问题。)这将如何改变答案?
  • @ShanZhengYang,在改变答案之前,应该有人改变问题
【解决方案2】:

您可以使用 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 反转其通常的活动并打印所有 不匹配 模式的行。此开关“反转”匹配。

【讨论】:

  • 我有一个约束是 file1.txt 实际上是前一个管道的输出。 (我试图在某种程度上简化这个问题。)这将如何改变答案?
  • () 中的部分是一个子进程,因此您可以从上面删除file1.txt 并将权限传递给(for ...)
  • 你能解释一下为什么你使用grep -v MarkerName吗?这将有助于像我这样的学习者。感谢您的帮助!
  • 不推荐使用的反引号、UUOC、非惯用的 awk 语法、未加引号的变量、不必要的命令和管道等...
【解决方案3】:

只有使用 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 实际上是前一个管道的输出。 (我试图在某种程度上简化这个问题。)这将如何改变答案?
  • 要从awk 获取管道输出,这似乎可行:` PIPE | awk 'NR==FNR && $8 >= 110000000 { a[$1]++; next } \ {for (i in a) if (i~$0) print}' file2.txt > final.txt`
猜你喜欢
  • 2016-07-09
  • 1970-01-01
  • 2021-05-27
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
相关资源
最近更新 更多