使用awk线性化FASTA时脚本中$f、tr、\t、\n等符号含义说明
FASTA线性化Awk脚本逐段解释
疑问符号/命令基础含义
$f:Bash Shell的自定义变量,用来存储待处理的输入FASTA文件路径。运行命令前需要先给该变量赋值,例如要处理sample.fasta,可先在终端执行f=sample.fasta。< $f:Shell输入重定向语法,作用是把$f指向的文件内容,作为前方awk命令的标准输入流,效果和直接把文件名写在awk命令后作为输入参数一致。|:Shell管道符,作用是将左侧命令的标准输出,直接作为右侧命令的标准输入做流式处理,全程不会生成临时中间文件,处理效率更高。tr:类Unix系统自带的字符转换工具,功能是对输入流的字符做一对一替换。这里的调用格式tr "\t" "\n"中:\t是转义字符,代表制表符(即键盘Tab键输入的空白分隔符,FASTA序列内容中不会出现该字符,适合做临时分隔标记)\n是转义字符,代表换行符,即文本中用来分隔不同行的控制字符
这段tr命令的实际作用,就是把输入流里所有的制表符全部替换成换行符。
> ${f/.fasta/_lin.fasta}:Shell输出重定向+变量字符串替换语法:- 开头的
>会把前方命令的最终输出结果,写入后方指定的文件,若文件已存在会直接覆盖 ${f/.fasta/_lin.fasta}是Bash内置的字符串替换规则,会自动把变量$f里第一个匹配到的.fasta子串替换为_lin.fasta,实现输出文件自动命名。例如$f值为human.fasta时,最终输出文件名就是human_lin.fasta。
- 开头的
脚本整体运行逻辑
整段命令的执行流程可以拆成3步:
- awk读取输入FASTA内容做初步拼接:
- 遇到
>开头的表头行时:如果不是第一条记录(计数器N>0),先输出一个换行符分隔上一条已经拼接完的序列,再输出当前表头内容,后面跟一个制表符做临时分隔,计数器N加1,跳过该行后续处理 - 遇到非
>开头的序列行时:直接输出该行内容,不追加换行符,这样同一条序列拆成多行存储的内容就会被拼接成连续的一整段 - 所有内容读取完成后,在末尾输出一个换行符,保证文件结尾格式规范
- 遇到
- awk输出的中间内容格式为
[表头1]\t[拼接后序列1]\n[表头2]\t[拼接后序列2]\n...,通过管道传给tr命令 - tr将中间内容里所有作为临时分隔符的制表符替换为换行符,就得到了标准线性化FASTA格式(每条记录占两行:第一行是>开头的表头,第二行是完整的单条序列),最终写入自动命名的输出文件。
输入文件指定方法
你可以根据使用场景选两种方式指定输入:
- 变量赋值方式(适合批量处理多个文件):
# 先给f变量赋值,指定要处理的文件 f="你的目标FASTA文件路径.fasta" # 再运行原脚本即可 awk '/^>/ {printf("%s%s\t",(N>0?"\n":""),$0);N++;next;} {printf("%s",$0);} END {printf("\n");}' < $f | tr "\t" "\n" > ${f/.fasta/_lin.fasta}
- 直接写死文件路径(适合单次处理单个文件):
直接把脚本里的$f换成实际输入文件路径,把输出路径也替换成你想要的文件名即可,例如处理input.fasta输出input_linear.fasta:
awk '/^>/ {printf("%s%s\t",(N>0?"\n":""),$0);N++;next;} {printf("%s",$0);} END {printf("\n");}' < input.fasta | tr "\t" "\n" > input_linear.fasta
补充:原脚本里的tr调用不是必须的,完全可以在awk逻辑里直接输出换行代替制表符,省掉一个管道调用,只是原作者选择了“awk打临时标记+tr替换标记”的实现思路而已。
内容的提问来源于stack exchange,提问作者Kuldeep More
相关产品推荐
相关产品推荐

