用于删除换行符的SED代码

时间:2018-06-20 09:12:40

标签: sed

我正在寻找sed命令,它将转换以下行:

>AT1G01020.6 | ARV1 family protein | Chr1:6788-8737 REVERSE LENGTH=944 | 201606
AGACCCGGACTCTAATTGCTCCGTATTCTTCTTCTCTTGAGAGAGAGAGAGAGAGAGAGA
GAGAGAGAGCAATGGCGGCGAGTGAACACAGATGCGTGGGATGTGGTTTTAGGGTAAAGT
CATTGTTCATTCAATACTCTCCGGGGAAATTGCAAGGAAGTAGCAGATGAGTACATCGAG
TGTGAACGCATGATTATTTTCATCGATTTAATCCTTCACAGACCAAAGGTATATAGACAC

进入

>AT1G01020.6 | ARV1 family protein | Chr1:6788-8737 REVERSE LENGTH=944 | 201606
AGACCCGGACTCTAATTGCTCCGTATTCTTCTTCTCTTGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGCAATGGCGGCGAGTGAACACAGATGCGTGGGATGTGGTTTTAGGGTAAAGTCATTGTTCATTCAATACTCTCCGGGGAAATTGCAAGGAAGTAGCAGATGAGTACATCGAGTGTGAACGCATGATTATTTTCATCGATTTAATCCTTCACAGACCAAAGGTATATAGACAC 

这意味着在>之后的换行符将保持不变,而在其他情况下,将加入换行符。

我尝试使用以下行,但是不起作用:

sed s/^!>\n$// <in.fasta>out.fasta

我有一个28MB的fasta文件,需要转换。

3 个答案:

答案 0 :(得分:0)

sed并不是一个特别好的工具。

awk '/^>/ { if(prev) printf "\n"; print; next }
    { printf "%s", $0; prev = 1; }
    END { if(prev) printf "\n" }' in.fasta >out.fasta

答案 1 :(得分:0)

使用awk:

awk '/^>/{print (l?l ORS:"") $0;l="";next}{l=l $0}END{print l}' file 

如果到达>或文件末尾,则打印该行,否则该行将缓冲在变量l中。

答案 2 :(得分:0)

遵循awk可能也对您有所帮助。无需使用任何数组或变量的值解决方案。

awk 'BEGIN{ORS=""} /^>/{if(FNR==1){print $0 RS} else {print RS $0 RS};next}1' Input_file

OR

awk 'BEGIN{ORS=""} /^>/{printf("%s",FNR==1?$0 RS:RS $0 RS);next}1' Input_file