我有一个fasta文件,其中的序列是用换行符分解的。 我想删除换行符。 这是我的文件的一个例子:
>accession1 ATGGCCCATG GGATCCTAGC >accession2 GATATCCATG AAACGGCTTA
我想将其转换为:
>accession1 ATGGCCCATGGGATCCTAGC >accession2 GATATCCATGAAACGGCTTA
我在这个网站上find了一个潜在的解决scheme,看起来像这样:
cat input.fasta | awk '{if (substr($0,1,1)==">"){if (p){print "\n";} print $0} else printf("%s",$0);p++;}END{print "\n"}' > joinedlineoutput.fasta
但是,这会在每个条目之间放置一个额外的换行符,所以文件如下所示:
>accession1 ATGGCCCATGGGATCCTAGC >accession2 GATATCCATGAAACGGCTTA
我是awk noob,但是我修改了命令。 我的猜测是if (p){print "\n";}
是罪魁祸首……潜在的print "\n"
增加了两个换行符。 我无法弄清楚如何添加一个新行…这可能是一件容易的事,但就像我说的,我是一个noob。 这是我的(不成功的)解决scheme:
awk '{if (substr($0,1,1)==">"){print "\n"$0} else printf("%s",$0);p++;}END{print "\n"}' input.fasta > joinedoutput.fasta
但是,这会在文件的开始处添加一个空行,因为它在打印第一个join号之前总是会打印一个新行:
{empty line} >accession1 ATGGCCCATGGGATCCTAGC >accession2 GATATCCATGAAACGGCTTA
任何人有一个解决scheme,以正确的格式获取我的文件? 谢谢!
这个awk
程序:
% awk '!/^>/ { printf "%s", $0; n = "\n" } /^>/ { print n $0; n = "" } END { printf "%s", n } ' input.fasta
会产生:
>accession1 ATGGCCCATGGGATCCTAGC >accession2 GATATCCATGAAACGGCTTA
在不以换行符开始的行上,打印换行符而不换行,并在后面存储换行符(在变量n
)。
在以“ >
开始的行上,打印存储的换行符(如果有的话)和行。 重置n
,以防万一这是最后一行。
如果需要,以换行符结束。
默认情况下,变量被初始化为空字符串。 没有必要在awk中明确地“初始化”一个变量,这是你在c和其他大多数传统语言中所做的。
– 6.1.3.1在程序中使用变量 , GNU Awk用户指南
还有另一个awk单行,应该为你的情况工作。
awk '/^>/{print s? s"\n"$0:$0;s="";next}{s=s sprintf("%s",$0)}END{if(s)print s}' file
接受的解决方案是好的,但不是特别的AWKish。 考虑使用它来代替:
awk '/^>/ { print (NR==1 ? "" : RS) $0; next } { printf "%s", $0 } END { printf RS }' file
说明:
对于以>
开头的行,打印行。 如果行不是文件中的第一行,则使用三元运算符打印前导换行符。 对于不以“ >
开头的行,打印没有结尾换行符的行。 由于文件的最后一行不会以>
开始,所以使用END
块来打印最后一个换行符。
请注意,通过设置一个空输出记录分隔符,可以更简洁地写出上述内容,从而启用默认打印并重新分配以>
开头的行。 尝试:
awk -v ORS= '/^>/ { $0 = (NR==1 ? "" : RS) $0 RS } END { printf RS }1' file
我会用这个sed
。 使用GNU sed
:
sed ':a; $!N; /^>/!s/\n\([^>]\)/\1/; ta; P; D' file
结果:
>accession1 ATGGCCCATGGGATCCTAGC >accession2 GATATCCATGAAACGGCTTA
说明:
创建一个标签, a
。 如果该行不是该文件的最后一行,请将其附加到模式空间。 如果该行不是以字符>
开始的,则执行替换s/\n\([^>]\)/\1/
。 如果自上次输入行被读取后替换成功,则分支标签为a
。 打印到当前模式空间的第一个嵌入换行符。 如果模式空间不包含换行符,就像d命令发出一样,开始一个正常的新周期。 否则,删除模式空间中的文本直到第一个换行符,然后重新启动循环,结果为模式空间,而不读取新的输入行。
另一个变化:-)
awk '!/>/{printf( "%s", $0);next} NR>1{printf( "\n")} END {printf"\n"} 7' YourFile
你能不能请跟随,让我知道这是否有助于你。
awk 'NR==1{print;next} ($0 ~ /^>/) && NR>1{print Q ORS $0;Q="";;next} {Q=Q?Q $0:$0} END{print Q}' Input_file
通过使用正则表达式检查行的开始或者是否开始这个解决方案。