我正在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
)
所以我希望将此条件添加到其中。
这是否(有效)可能?
答案 0 :(得分:1)
您想要的是管道中的流处理器。 <aligner> reads.fastq | grep -E '^@|$' | samtools view -bS - >out.bam
在这里可能就足够了:
grep
这只会将以 @ 开头的行或以 NH:i:1 结尾的行从一个流程传递到另一个流程。
没有理由像这样插入label{
white-space:nowrap;
}
应该效率低下。