【问题标题】:Piping output stream with conditions linux使用条件 linux 管道输出流
【发布时间】:2015-09-18 23:42:24
【问题描述】:

我正在 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;@BCCCCCCA NH:i:20

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

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

没有这个条件,我的管道命令看起来像这样:

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

(具体来说,program1 是一个 RNA-seq 读取对齐器,program2 是 samtools。program1 的输出是一个文本 sam 文件,我将其通过管道传输到 samtools 以将其转换为 bam 格式。因此,此命令如下所示:

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

)

所以我想在其中添加我的条件。

这(有效地)可能吗?

【问题讨论】:

    标签: linux unix command pipe


    【解决方案1】:

    您想要的是管道中的流处理器。 grep 在这里可能就足够了:

    <aligner> reads.fastq | grep -E '^@|$'  | samtools view -bS - >out.bam
    

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

    没有理由像这样插入grep 会明显低效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 2018-02-21
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 2017-08-02
      相关资源
      最近更新 更多