使用SED / Perl删除字符和删除空行

时间:2012-01-19 07:21:56

标签: linux perl unix sed

我想从看起来像这样的数据中删除所有'N':

>Seq1
NNNNNNNNA
NNNNNNNNN
ATCGGGGGG
NNNNNNNNN
GTCGGGGGG
>Seq2
GATAAAAAA
NNNNNNNNN

这样它就会返回:

>Seq1
AATCGGGGGGGTCGGGGGG
>Seq2
GATAAAAAA

但为什么不这样做:

sed -e 's/N//g' 

采用这种方法的正确方法是什么?

5 个答案:

答案 0 :(得分:2)

这是我的Perl解决方案:

perl -pe 'if (!/^>/) { tr/N\n//d } elsif ($. > 1) { $_ = "\n$_" }' input-file

答案 1 :(得分:1)

使用:

sed ':a;N;$!ba;s/[N\n]//g'

[N \ n]匹配Ns或新行。其余部分来自this question on StackOverflow

答案 2 :(得分:1)

这可能对您有用:

sed '/>Seq/{:a;x;s/N//g;s/\n//2gp;g;x;d};H;$ba;d' file
>Seq1
AATCGGGGGGGTCGGGGGG
>Seq2
GATAAAAAA

或者这个:

sed ':a;$!{N;ba};s/[N\n]//g;s/>Seq[0-9]*/\n&\n/g;s/.//' file
>Seq1
AATCGGGGGGGTCGGGGGG
>Seq2
GATAAAAAA

答案 3 :(得分:1)

简单awk应该可以做到 -

awk '!/^N+/' filename

测试:

[jaypal:~/Temp] cat temp
>Seq1
NNNNNNNNA
NNNNNNNNN
ATCGGGGGG
NNNNNNNNN
GTCGGGGGG
>Seq2
GATAAAAAA
NNNNNNNNN

[jaypal:~/Temp] awk '!/^N+/' temp
>Seq1
ATCGGGGGG
GTCGGGGGG
>Seq2
GATAAAAAA

答案 4 :(得分:0)

你需要'\ n'来匹配换行符:

sed -e 's/[N\n]//g'

如果这不符合您的要求,请告诉我们,它的作用并解释与您想要的不同