我有一个FASTA格式文件:
>Ipunensis_00386 Yfr1
GCGGAGACGAAAGTTTCCGTTCACTCCTCACACCACACTCCGCCCAAATCATTGATTTGG
GCGGTT
>Ipunensis_00401 tRNA-Gly(gcc)
GCGGGTATAGCTCAGTGGTAGAGCGTCACCTTGCCAAGGTGAATGTCGCGCGTTCGAATC
GCGTTACCCGCT
>Ipunensis_00001 transposase IS4 family protein
ATGCAGAAGTTTCAGGGCATCCACTGGGTCAACCTAGACGGGCAGCACCAGGTTAGCAAT
CTCAGTGATGAGCGACGCTTAATCATCCACCTCTTGGGGCCACCTGTTGAGCGCTACTAC
CATGCCCCTGGTTAA
>Ipunensis_00002 Photosystem I assembly protein Ycf3
ATGCGTCACCCCGCCAAGTTACTCGGGTTAGTCACTCTCACCAGTATGCTTACGCTGGCT
>Ipunensis_00003 Cell wall-associated protease
ATGAAACGTTTTCTGACCAGTCTTTTGCTGACGGGCCTGCTTTGGCATAGTGGGGGCAGC
GTTGGGGTTGGGAGAGGTGCGATCGCACAAACCCAGTCCACCCCAGACCTCTACTACACC
>Ipunensis_00004 Photosystem I assembly protein Ycf3
TTGACCTGCGGCCCGCAGCCCTACCTGCCCAACCTGACTCCAGAAATTCCCATGATCTAC
CGCCTCTCGTCTCCCGGATTTTTGCTGGCGCTGCTGCTGCTATCTGCCGTCGATCCGGCA
>Ipunensis_00226 tRNA-Leu(gag)
TGCGGATGTGGTGGAACTGGTAGACACGCACGTTTGAGGGGCGTGTGGCTTACGCCTTGC
GAGTTCGAGTCTCGCCATCCGCAT
>Ipunensis_00045 tRNA-Ala(cgc)
GGGGAATTAGCTCAGCTGGTAGAGCGCTGCGATCGCACCGCAGAGGTCAGGAGTTCGAAT
CTCCTATTCTCCA
>Ipunensis_00357 glnA
ATCGTTCATCTCTTCAAACTGTCAAAGCTACTTACAAAAGCTACAGACGCACCAAGAGAC
GGAAGTAGGGGTCTGATCCCCCCGAAGGAACGCGCC
>Ipunensis_00403 tRNA-Gly(gcc)
GCGGGTATAGCTCAGTGGTAGAGCGTCACCTTGCCAAGGTGAATGTCGCGCGTTCGAATC
如何根据字母数字 ID 对上述 fasta 文件进行排序:以 >Ipunensis_00001 开头,依此类推。
期望的输出:
>Ipunensis_00001 transposase IS4 family protein
ATGCAGAAGTTTCAGGGCATCCACTGGGTCAACCTAGACGGGCAGCACCAGGTTAGCAAT
CTCAGTGATGAGCGACGCTTAATCATCCACCTCTTGGGGCCACCTGTTGAGCGCTACTAC
CATGCCCCTGGTTAA
>Ipunensis_00002 Photosystem I assembly protein Ycf3
ATGCGTCACCCCGCCAAGTTACTCGGGTTAGTCACTCTCACCAGTATGCTTACGCTGGCT
>Ipunensis_00003 Cell wall-associated protease
ATGAAACGTTTTCTGACCAGTCTTTTGCTGACGGGCCTGCTTTGGCATAGTGGGGGCAGC
GTTGGGGTTGGGAGAGGTGCGATCGCACAAACCCAGTCCACCCCAGACCTCTACTACACC
>Ipunensis_00004 Photosystem I assembly protein Ycf3
TTGACCTGCGGCCCGCAGCCCTACCTGCCCAACCTGACTCCAGAAATTCCCATGATCTAC
CGCCTCTCGTCTCCCGGATTTTTGCTGGCGCTGCTGCTGCTATCTGCCGTCGATCCGGCA
>Ipunensis_00045 tRNA-Ala(cgc)
GGGGAATTAGCTCAGCTGGTAGAGCGCTGCGATCGCACCGCAGAGGTCAGGAGTTCGAAT
CTCCTATTCTCCA
>Ipunensis_00226 tRNA-Leu(gag)
TGCGGATGTGGTGGAACTGGTAGACACGCACGTTTGAGGGGCGTGTGGCTTACGCCTTGC
GAGTTCGAGTCTCGCCATCCGCAT
>Ipunensis_00357 glnA
ATCGTTCATCTCTTCAAACTGTCAAAGCTACTTACAAAAGCTACAGACGCACCAAGAGAC
GGAAGTAGGGGTCTGATCCCCCCGAAGGAACGCGCC
>Ipunensis_00386 Yfr1
GCGGAGACGAAAGTTTCCGTTCACTCCTCACACCACACTCCGCCCAAATCATTGATTTGG
GCGGTT
>Ipunensis_00401 tRNA-Gly(gcc)
GCGGGTATAGCTCAGTGGTAGAGCGTCACCTTGCCAAGGTGAATGTCGCGCGTTCGAATC
GCGTTACCCGCT
>Ipunensis_00403 tRNA-Gly(gcc)
GCGGGTATAGCTCAGTGGTAGAGCGTCACCTTGCCAAGGTGAATGTCGCGCGTTCGAATC
答案1
使用 GNU sort & sed,假设文件中不能出现空字节:
sed 's/^>/\x00&/' file | sort -z | tr -d '\0'
这会用空字节分隔以>
空字节开头的块,然后使用GNU 排序的-z
/--zero-terminated
选项按字典顺序对记录进行排序,然后tr
删除空字节。
答案2
使用 GNU
sort
加上 POSIXawk
和cut
:awk '/^>/{key=$1} {print key, $0}' file | sort -k1,1 -s | cut -d' ' -f2-
这是可行的,因为我们可以使用 GNU 排序
-s
(“稳定排序”)选项来确保保留每个块内的原始行顺序,而不必像下一个示例中那样打印原始行号并另外进行排序。或者,使用所有 POSIX/标准 UNIX 工具:
awk '/^>/{key=$1} {print key, NR, $0}' file | sort -k1,1 -k2,2n | cut -d' ' -f3-
这样做的好处是它可以在所有 UNIX 系统上运行。
上面两种方法都比下面的方法有好处gawk
- 仅替代方案awk
不必将整个输入文件存储在内存中,因此即使对于大量输入文件它也可以工作 - 只有sort
该管道中的文件必须处理整个文件并且它使用请求分页等就能够做到这一点。
最后,使用 GNU awk 进行
sorted_in
(参见https://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Scanning):awk ' /^>/{key=$1} {vals[key]=vals[key] $0 ORS} END { PROCINFO["sorted_in"]="@ind_str_asc"; for (key in vals) printf "%s", vals[key] } ' file
如果您将其作为某些较大脚本的中间部分来执行,那么最后一个确实是更好的选择,
awk
因此使用外部 shell 工具进行排序是一个不太理想的选择。
答案3
这与以下基本思想相同客人很聪明\0
伎俩,但不需要 GNU 工具:
$ perl -pe '/>/ ? s/\n/\t/ : s/\n//; ' foo.fa | sort | perl -pe 's/(?<=.)>/\n>/g; y/\t/\n/' | fold -w 60
>Ipunensis_00386 Yfr1
GCGGAGACGAAAGTTTCCGTTCACTCCTCACACCACACTCCGCCCAAATCATTGATTTGG
GCGGTT
>Ipunensis_00401 tRNA-Gly(gcc)
GCGGGTATAGCTCAGTGGTAGAGCGTCACCTTGCCAAGGTGAATGTCGCGCGTTCGAATC
GCGTTACCCGCT
>Ipunensis_00001 transposase IS4 family protein
ATGCAGAAGTTTCAGGGCATCCACTGGGTCAACCTAGACGGGCAGCACCAGGTTAGCAAT
CTCAGTGATGAGCGACGCTTAATCATCCACCTCTTGGGGCCACCTGTTGAGCGCTACTAC
CATGCCCCTGGTTAA
>Ipunensis_00002 Photosystem I assembly protein Ycf3
ATGCGTCACCCCGCCAAGTTACTCGGGTTAGTCACTCTCACCAGTATGCTTACGCTGGCT
>Ipunensis_00003 Cell wall-associated protease
ATGAAACGTTTTCTGACCAGTCTTTTGCTGACGGGCCTGCTTTGGCATAGTGGGGGCAGC
GTTGGGGTTGGGAGAGGTGCGATCGCACAAACCCAGTCCACCCCAGACCTCTACTACACC
>Ipunensis_00004 Photosystem I assembly protein Ycf3
TTGACCTGCGGCCCGCAGCCCTACCTGCCCAACCTGACTCCAGAAATTCCCATGATCTAC
CGCCTCTCGTCTCCCGGATTTTTGCTGGCGCTGCTGCTGCTATCTGCCGTCGATCCGGCA
>Ipunensis_00226 tRNA-Leu(gag)
TGCGGATGTGGTGGAACTGGTAGACACGCACGTTTGAGGGGCGTGTGGCTTACGCCTTGC
GAGTTCGAGTCTCGCCATCCGCAT
>Ipunensis_00045 tRNA-Ala(cgc)
GGGGAATTAGCTCAGCTGGTAGAGCGCTGCGATCGCACCGCAGAGGTCAGGAGTTCGAAT
CTCCTATTCTCCA
>Ipunensis_00357 glnA
ATCGTTCATCTCTTCAAACTGTCAAAGCTACTTACAAAAGCTACAGACGCACCAAGAGAC
GGAAGTAGGGGTCTGATCCCCCCGAAGGAACGCGCC
>Ipunensis_00403 tRNA-Gly(gcc)
GCGGGTATAGCTCAGTGGTAGAGCGTCACCTTGCCAAGGTGAATGTCGCGCGTTCGAATC
解释
第一个命令将在包含 a 的行上perl
用 a 替换换行符,而在不包含 a 的行上则不替换任何内容。这会将 id 和序列放在同一行,并用制表符分隔。\t
>
然后将其传递给sort
,然后是第二个 perl,它用>
换行符替换,但前提是它们前面有另一个字符(以避免在第一个条目之前添加额外的换行符)。这会转换回类似 fasta 的格式。
最后,我们传递输出fold -w 60
以获得标准的 60 字符 fasta 格式。但请注意,如果 ID 行碰巧超过 60 个字符,这也会折叠 ID 行。如果这是一个问题,你可以尝试这两个awk
如果这是一个问题,你可以尝试我的之前发布过并做:
$ FastaToTbl foo.fa | sort | TblToFasta
>Ipunensis_00001 transposase IS4 family protein
ATGCAGAAGTTTCAGGGCATCCACTGGGTCAACCTAGACGGGCAGCACCAGGTTAGCAAT
CTCAGTGATGAGCGACGCTTAATCATCCACCTCTTGGGGCCACCTGTTGAGCGCTACTAC
CATGCCCCTGGTTAA
>Ipunensis_00002 Photosystem I assembly protein Ycf3
ATGCGTCACCCCGCCAAGTTACTCGGGTTAGTCACTCTCACCAGTATGCTTACGCTGGCT
>Ipunensis_00003 Cell wall-associated protease
ATGAAACGTTTTCTGACCAGTCTTTTGCTGACGGGCCTGCTTTGGCATAGTGGGGGCAGC
GTTGGGGTTGGGAGAGGTGCGATCGCACAAACCCAGTCCACCCCAGACCTCTACTACACC
>Ipunensis_00004 Photosystem I assembly protein Ycf3
TTGACCTGCGGCCCGCAGCCCTACCTGCCCAACCTGACTCCAGAAATTCCCATGATCTAC
CGCCTCTCGTCTCCCGGATTTTTGCTGGCGCTGCTGCTGCTATCTGCCGTCGATCCGGCA
>Ipunensis_00045 tRNA-Ala(cgc)
GGGGAATTAGCTCAGCTGGTAGAGCGCTGCGATCGCACCGCAGAGGTCAGGAGTTCGAAT
CTCCTATTCTCCA
>Ipunensis_00226 tRNA-Leu(gag)
TGCGGATGTGGTGGAACTGGTAGACACGCACGTTTGAGGGGCGTGTGGCTTACGCCTTGC
GAGTTCGAGTCTCGCCATCCGCAT
>Ipunensis_00357 glnA
ATCGTTCATCTCTTCAAACTGTCAAAGCTACTTACAAAAGCTACAGACGCACCAAGAGAC
GGAAGTAGGGGTCTGATCCCCCCGAAGGAACGCGCC
>Ipunensis_00386 Yfr1
GCGGAGACGAAAGTTTCCGTTCACTCCTCACACCACACTCCGCCCAAATCATTGATTTGG
GCGGTT
>Ipunensis_00401 tRNA-Gly(gcc)
GCGGGTATAGCTCAGTGGTAGAGCGTCACCTTGCCAAGGTGAATGTCGCGCGTTCGAATC
GCGTTACCCGCT
>Ipunensis_00403 tRNA-Gly(gcc)
GCGGGTATAGCTCAGTGGTAGAGCGTCACCTTGCCAAGGTGAATGTCGCGCGTTCGAATC