fasta文件多行变一行,按序列长度排序

统计fasta序列长度

fastalength xx.fna

Method 1

多行变一行

awk '{if($0~/>/) name=$0 ;else seq[name]=seq[name]$0;}END{for(i in seq) print i"\n"seq[i]"\n"}' CP-32.fna > CP-32_sigleRow2.fna

按sequence length从大到小排序

#!/bin/bash

# 输入文件名
input_file="$1"
# 输出文件名
output_file="$2"
# 前缀字符
prefix="$3"

# 初始化变量
seq_name=""
seq=""

# 创建一个临时文件保存序列信息
temp_seq_file=$(mktemp)

# 读取输入FASTA文件并提取序列信息
while read -r line; do
    # 判断是否是序列名称行
    if [[ $line == ">"* ]]; then
        # 如果之前有序列,保存其信息
        if [[ -n $seq_name ]]; then
            seq_length=${#seq}
            echo "$seq_name,$seq_length,$seq" >> "$temp_seq_file"
        fi
        # 重置变量
        seq_name=$line
        seq=""
    else
        # 累加序列内容
        seq+=$line
    fi
done < "$input_file"

# 处理最后一条序列
if [[ -n $seq_name ]]; then
    seq_length=${#seq}
    echo "$seq_name,$seq_length,$seq" >> "$temp_seq_file"
fi

# 创建一个临时文件保存排序后的FASTA内容
temp_sorted_file=$(mktemp)

# 按照序列长度排序并重新编号
sort -t ',' -k2,2nr "$temp_seq_file" | awk -F ',' -v prefix="$prefix" '{print ">" prefix NR "\n" $3}' > "$temp_sorted_file"

# 将临时文件重命名为输出文件
mv "$temp_sorted_file" "$output_file"

# 删除临时文件
rm "$temp_seq_file"

echo "Done. 输出文件为: $output_file"

运行:

./rename_fasta_with_rank.sh input.fasta output.fasta PREFIX_

Reference: https://blog.csdn.net/SUMPLUSS/article/details/140751285

Method 2

fna文件多行变一行

awk '{if(0~/>/) name=0 ;else seq[name]=seq[name]$0;}END{for(i in seq) print i"\n"seq[i]"\n"}' CP-32.fna > CP-32_sigleRow_ts.fna

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容