在bash中过滤文本文件的某些部分的问题

时间:2016-12-04 22:57:31

标签: python bash

我有一个像小例子的文件: 小例子:

>ENSG00000004142|ENST00000003607|POLDIP2|||2118
Sequence unavailable
>ENSG00000003056|ENST00000000412|M6PR|9099001;9102084|9099001;9102551|2756
CCAGGTTGTTTGCCTCTGGTCGGAAAGGGAAACTACCCCTGCTTCCACTCTGACAGCAGA

但我有太多"序列不可用"。我想摆脱那些成绩单。结果将是这样的:

>ENSG00000003056|ENST00000000412|M6PR|9099001;9102084|9099001;9102551|2756
CCAGGTTGTTTGCCTCTGGTCGGAAAGGGAAACTACCCCTGCTTCCACTCTGACAGCAGA

我尝试使用

过滤掉bash中的那些部分
grep -A 2 "Sequence" your.fa | grep -v "\-\-" | sed -n '/Sequence/!p' > new.fa

但它只是删除了#34;序列不可用"但不是它的标题(该行以每个序列上方的">"开头,这是每个序列的标识符)

如何在bash或python中过滤掉它们?

1 个答案:

答案 0 :(得分:2)

假设应删除包含$ sed '$!N;/\nSequence unavailable$/d;P;D' input 的行以及上面的行,可以使用此sed:

$!N;                               # Append Next line to pattern space unless
                                   # there are no more lines
    /\nSequence unavailable$/d     # Delete whole pattern space if regex is matched
                               P;  # Print first line of pattern space
                                 D # Delete first line of pattern space

基本上它通过在模式空间中读取两条线来工作,然后打印顶部的一条线,并将其从模式空间中移除,因此将当前线留在模式空间中,这导致总是落后一行:

;D

上面的工作在GNU sed中,可能需要更改;$!D;q {{1}}以使其与严格的POSIX sed一起工作,否则会有无限循环。