从大型FASTA文件提取前50条最长转录本并保存至指定目录
提取FASTA文件中前50条最长转录本并迁移的解决方案
我有一个包含10万多条转录本的大型FASTA文件,想要从中提取前50条最长的转录本。通过以下awk命令可以得到按长度从长到短排序的转录本名及对应长度:
awk -vRS=">" -vORS="\n" -vFS="\n" -vOFS="\t" ' NR>1 {a=$1; $1 = ""; print a, length($0)-NF+1} ' /storage/data/sample/filename.fasta
确认前50条转录本的长度均超过8100后,我编写了筛选命令,但需要完成两个操作:1)将筛选结果保存为单个FASTA文件;2)将该文件移动至/station/work/目录。同时要求不改动原文件、不复制整个大文件,且避免生成多个单独的FASTA文件。
解决方案
方法一:先提取保存再移动
- 执行以下awk命令,提取前50条符合长度要求的转录本并保存为单个文件:
awk -vRS=">" -vORS="" -vFS="\n" -vOFS="\n" ' NR>1 { a=$0; $1=""; seq_len = length($0)-NF+1; if(seq_len>8100) { print ">"a; count++; if(count>=50) exit; # 找到50条后立即退出,提升处理效率 } }' /storage/data/sample/filename.fasta > top50_longest_transcripts.fasta
- 将生成的文件移动到目标目录:
mv top50_longest_transcripts.fasta /station/work/
方法二:直接生成到目标目录(一步到位)
无需额外移动操作,直接将输出写入目标路径的文件:
awk -vRS=">" -vORS="" -vFS="\n" -vOFS="\n" ' NR>1 { a=$0; $1=""; seq_len = length($0)-NF+1; if(seq_len>8100) { print ">"a; count++; if(count>=50) exit; } }' /storage/data/sample/filename.fasta > /station/work/top50_longest_transcripts.fasta
说明
- 上述命令通过
count变量控制只提取前50条符合条件的序列,找到后立即退出,无需遍历整个大文件,处理效率更高。 - 输出结果会被写入单个FASTA文件,不会生成多条序列各自单独的文件。
- 整个过程不会修改原FASTA文件,仅读取必要内容并输出目标序列。
示例短序列
>scaffold_144150_c1 CCCCAGAATTCTGGGAGCTCGGCTATGGACTCCAATACAGCCCTTTGACGGGGACGGAACATCGGCAATGACTTAGGACCAAGAACCCGAGCATATTCGACAAAATTCTTGTCGCTTATGCTACGCCACTTAACAGTGGGAATAACGGATTCTGGTGTAATAATCTTGCCTGCAAACTCGGCTATCCTTCCCGAGATAGT >scaffold_144149_c1 CGCCCTGGAGGGTCACGGTCACGAAGACCGGCATGGCAAACAGGGCGAAAAGCCCGCTCAGATAGAACAGCGTGGACACGAGACCGGCCAGGACCGGATGCTCGCTCAGCTGAACGACGAATCTTCGGAACACGCCCGCTCTCAGCGCGGAGAAGCGTTCGGGGACGAGCCCGGCGGACTTCCTCAGAAACGTCCATGG >scaffold_144148_c1 ACAGTTACAGGCTGAATTACTATTACTGGATAATTAGCAGTATTGCCGTTTGAGCCTGTAACACTAATAGTGCCGAATGCCATACCTAAAGAATTTGAGCCCGCTGTAAATGGATTTTTTAAATCCAATACACCGTTTATACCAGCCTGATACATACTAACTAAACAGCCATCAGTTGCGTTTGCTTGGGATGGAAACTG >scaffold_144147_c1 GTGACGTTAGCATGTCCCGTTGCATTCAGTGTCACATTTGAAAGATACACGTAGAAGTGTACTGTGGAACCTATTGCAACAGTTTCAGATGTCGGTATCAGGAAAACCTGTAAATGCTGTGAAAGGACTATAATGGTGAGATTCGCATATGCTACGTTTCCAACGTTGTCAGTTATTTTCAGTTCAAAATGATAAGTTCC >scaffold_144146_c1 ACAGAACATATGGTAATGTAACGAGTGCATCTTCCATTACAGGAAATTATGGATCTTCATATGCGTTCACGATAAGTGCATCTGGAACTTACACAGTCGTTGTCGTAACCAATGTCAATCAAAATGCCACACAGACAGAAGCGCCATGGGTTGTTAAGATAGACAACTCTTTGCCTTCATTAAAACTTCTACCAGCAACG >scaffold_144145_c1 ATCTTGCTGTAGGAGAGGAGAACGGCGAGTTCGGGACGCGTGAATCCCTTGCCGAGGGCCCGGCGCGCGGCGAGCTCGTCGCCCGTCGGGAGCCCCTCGAGCTGACGCTGGAGGAGACCCTGACGCTCGAGCTGACGCATGAGAAAGACGTGTTCGTCGAACCGCGCCGGGGCGTAGGCGTTGGCGAGCGCGAGCGCGAG >scaffold_144144_c1 GCAGGAAAGACCGCTCTCGACGATCTTGTGACCGTCATCACGGGGCCATTCCGGTTCCGCTTCAAGGTCAACAACAAGGTCTACTACGAGGACAGCCCGCTTGCTGCTCTTCCTCCGCACTACAGCTTCGGGTCTTCGCAGGCGGCAACCACGACGGCTACTACGACTACGGTTGTCGGCGGCTACGGGTCGGTCACAGG >scaffold_144143_c1 ACTGTGACTGGTGATTCCGGTACAAGCCCAGTGACTGTTTCAGTTATACCAGGCTCAGGCACCGTCACATATTCAGGTGAATCAATAGTTACGAGCACTTCTTACTTTGCACAGGGCACAACAACCCCAGTAGTATCGTCTGAATCACCGTCCTCGGCCGGAACATACACATACCCACTTTACGTGGTATTTACAGGTGT >scaffold_144142_c1 CAACCTTATACAATCTGGTTATATCACCATATCTATGCCATCAACCGCTTCTATAGCAAGTATAAGCGTTCTGAACACAAGCGCCAGCTGTCCAACAAACGGCATATTAACATCTACAAGCACTCCCAATGTGTATTACATAAACTTAGCAACACTAGCATCGTTGTGTACAGGTCTCACTCCAACAGCATGGCAATCTG >scaffold_144141_c1 CAACCTTATACAATCTGGTTATATCACCATATCTATGCCATCAACCGCTTCTATAGCAAGTATAAGCGTTCTGAACACAAGCGCCAGCTGTCCAACAAACGGCATATTAACATCTACAAGCACCCCCAATGTGTATTACATAAACTTAGCAACACTAGCATCGTTGTGTACAGGTCTCACTCCAACAGCATGGCAATCTG
内容的提问来源于stack exchange,提问作者deliza123




