一条命令实现fasta序列多行变单行

许多序列处理软件要求fasta序列为单行,但很多时候下载的序列都是多行fasta序列,因此需要转换成单行fasta格式:

多行fasta文件未test.fa:

test$cat test.fa 
>seq1
ATTAAAGGTTTATACCTTCC
AATCTGTGTGGCTGTCACTC
ACACGAGTAACTCGTCTATC
>seq2
ATTAAAGGTTTATACCTTCC
AATCTGTGTGGCTGTCACTC

1.使用awk加条件判断(比较快)

test$awk '{if($0~/>/) name=$0 ;else seq[name]=seq[name]$0;}END{for(i in seq) print i"\n"seq[i]}}' test.fa
>seq1
ATTAAAGGTTTATACCTTCCAATCTGTGTGGCTGTCACTCACACGAGTAACTCGTCTATC
>seq2
ATTAAAGGTTTATACCTTCCAATCTGTGTGGCTGTCACTC

2. 使用awk(比较快)

test$awk '/^>/&&NR>1{print "";}{printf "%s",/^>/?$0"\n":$0}' test.fa >test2.fa
test$cat test2.fa
>seq1
ATTAAAGGTTTATACCTTCCAATCTGTGTGGCTGTCACTCACACGAGTAACTCGTCTATC
>seq2
ATTAAAGGTTTATACCTTCCAATCTGTGTGGCTGTCACTC $test # 末尾未换行

该方法在最后一行无换行符号,需要加一个换行符号。

test$sed -i '$s/$/\n/' test2.fa 
test$cat test2.fa
>seq1
ATTAAAGGTTTATACCTTCCAATCTGTGTGGCTGTCACTCACACGAGTAACTCGTCTATC
>seq2
ATTAAAGGTTTATACCTTCCAATCTGTGTGGCTGTCACTC # 末尾已换行
$test

有小伙伴留言 第一条awk命令没看懂,在这儿详细解释一下:
awk命令是读一行然后对这一行用命令处理,就是一行一行的处理命令。

  1. /^>/&&NR>1{print "";}这部分就是一个简单的匹配然后操作的命令,意思是开头为>且行数大于1时,首先print一下,print后面啥也不跟,就意味着打印一个换行符换行。

  2. {printf "%s",/^>/?$0"\n":$0}printf 是一个格式打印的意思,%s就是打印字符串。后面跟打印的内容,/^>/?$0"\n":$0是一个二维判断运行结构,前表示匹配条件,如果匹配前面的条件,运行前的命令,如果不匹配,运行:后面的内容,即,如果该行以>开头,就是标题行,打印该行($0)并换行(“\n”),如果不匹配,直接打印该行。

  3. 对于整个命令,在第一行>seq1时,虽然匹配/^>/但不匹配NR>1,所以后面的{print "";}不运行。命令继续往后运行,到{printf "%s",/^>/?$0"\n":$0},由于该行以>开头,所以匹配,运行前的命令,打印该行,就是第一个序列的标题行,并换行。

  4. 第2行序列行,第一部分不匹配,直接运行第二部分命令,由于不是以>开头,所以直接打印,同样第3行也是运行第二部分命令,直接打印序列,中间不换行。一直到下一个标题行(以>开头),注意末尾没有换行符。

  5. 命令一直运行到第二条序列的开头>seq2,以“>”开头且行数大于1,匹配第一部分,打印换行符,这是因为上一行以序列结尾,没有换行符。运行第二部分,匹配前的部分,打印标题行,换行。然后下一行开始打印序列直至第3条序列的标题行。

  6. 开头的 /^>/&&NR>1{print "";},其实就是为了上一条序列末尾行没有换行,在开启一条新的序列的时候,需要换行,打印一个换行符。由于整个文件最后一行是序列,所以最终文件末端没换行。除了用sed加一个换行的方法外,还可以试试awk '/^>/&&NR>1{print "";}{printf "%s",/^>/?$0"\n":$0}END{print "";}' test.fa >test2.fa, 用END命令在最后加一个换行符。这个命令应该管用,不过我没试过。

3. 使用 tr和sed,速度未测算

test$cat test.fa | tr '\n' '\t' | sed 's/\t>/\n>/g' |sed 's/\t/\n/' | sed 's/\t//g' 
>seq1
ATTAAAGGTTTATACCTTCCAATCTGTGTGGCTGTCACTCACACGAGTAACTCGTCTATC
>seq2
ATTAAAGGTTTATACCTTCCAATCTGTGTGGCTGTCACTC

猜你喜欢

转载自blog.csdn.net/weixin_44022515/article/details/104257520