使用条件linux

时间:2015-07-01 17:14:38

标签: linux unix command pipe

我正在Linux中运行一个程序,它正在产生一个输出,我想把它输入到另一个程序中。但是,我想只管道符合我标准的行。显然,这可以通过两个步骤实现。但是,由于我在谈论数百万行,所以一步到位就更有效率了。

输出流的格式(如果您熟悉下一代排序,则为sam文件格式)是制表符分隔文本,由两种类型的行组成。一个以“@”字符开头的。例如:

  

@HD VN:1.0

     

@SQ SN:ENST00000601705.1 LN:42

     

@SQ SN:ENST00000602818.1 LN:1099

另一个没有,看起来像这些示例行:

  

SRR603690.1629913 99 ENST00000440588.2 327 255 76M   = 390 139 GCAGATCCTGGACCAGGTTGAGCTGCGCGCAGGCTACCCTCCAGCCATACCCCACAACCTCTCCTGCCTCATGAAC   CCCFFFFFHGHHGJIHIHIHIJJJIIF1DGHGIIJIGGHIII @ GIIDHIGHHHDFB ACEDA(5;?@BCCCCCCCA   NH:I:20

     

SRR603690.1629913 99 ENST00000464365.2 2 255 76M   = 65 139 GCAGATCCTGGACCAGGTTGAGCTGCGCGCAGGCTACCCTCCAGCCATACCCCACAACCTCTCCTGCCTCATGAAC   CCCFFFFFHGHHGJIHIHIHIJJJIIF1DGHGIIJIGGHIII @ GIIDHIGHHHDFB ACEDA(5;?@BCCCCCCCA   NH:I:20

我正在寻找的是一个命令,它只会管道第一种类型的所有行,但是来自第二种类型,只有最后一个字段为“NH:i:1”的行。

如果没有这个条件,我的管道命令如下所示:

> <program1> <program1_arguments> | <program2> <program2_arguments>

(具体来说,program1是一个RNA-seq读取对齐器,program2是samtools。program1的输出是一个文本sam文件,我正在将其转换为samtools以将其转换为bam格式。因此,此命令如下所示:< / p>

> <aligner> reads.fastq | samtools view -bS - > out.bam

所以我希望将此条件添加到其中。

这是否(有效)可能?

1 个答案:

答案 0 :(得分:1)

您想要的是管道中的流处理器。 <aligner> reads.fastq | grep -E '^@|$' | samtools view -bS - >out.bam 在这里可能就足够了:

grep

这只会将以 @ 开头的行或以 NH:i:1 结尾的行从一个流程传递到另一个流程。

没有理由像这样插入label{ white-space:nowrap; }应该效率低下。