使用 awk 连接行

Concatenating lines using awk

我有包含两个基因序列的 fasta 文件,我想做的是删除 fasta header(以“>”开头的行),连接其余行并输出该序列

这是我的 fasta 序列 (genome.fa):

>Potrs164783
AGGAAGTGTGAGATTGAAAAAACATTACTATTGAGGAATTTTTGACCAGATCAGAATTGAACCAACATGATGAAGGGGAT
TGTTTGCCATCAGAATATGGCATGAAATTTCTCCCCTAGATCGGTTCAAGCTCCTGTAGGTTTGGAGTCCTTAGTGAGAA
CTTTCTTAAGAGAATCTAATCTGGTCTGTTCCTCGTCATAAGTTAAAGAAAAACTTGAAACAAATAACAAGCATGCATAA
>Potrs164784
TTACCCTCTACCAGCACCAATGCCTATGATCTTACAAAAATCCTTAATAAAAAGAAATCCAAAACCATTGTTACCATTCC
GGAATTACATTCTGAGATAAAAACCCTCAAATCTGAATTACAATCCCTTAAACAAGCCCAACAAAAAGACTCTGCCATAC

期望的输出

AGGAAGTGTGAGATTGAAAAAACATTACTATTGAGGAATTTTTGACCAGATCAGAATTGAACCAACATGATGAAGGGGAT
TGTTTGCCATCAGAATATGGCATGAAATTTCTCCCCTAGATCGGTTCAAGCTCCTGTAGGTTTGGAGTCCTTAGTGAGAA
CTTTCTTAAGAGAATCTAATCTGGTCTGTTCCTCGTCATAAGTTAAAGAAAAACTTGAAACAAATAACAAGCATGCATAA
TTACCCTCTACCAGCACCAATGCCTATGATCTTACAAAAATCCTTAATAAAAAGAAATCCAAAACCATTGTTACCATTCC
GGAATTACATTCTGAGATAAAAACCCTCAAATCTGAATTACAATCCCTTAAACAAGCCCAACAAAAAGACTCTGCCATAC

我正在使用 awk 执行此操作,但出现此错误

awk 'BEGIN{filename="file1"}{if( ~ />/){filename=; sub(/>/,"",filename); print filename;} print [=12=] >filename.fa;}' ../genome.fa

awk: syntax error at source line 1
 context is
    BEGIN{filename="file1"}{if( ~ />/){filename=; sub(/>/,"",filename); print filename;} print [=12=] >>>  >filename. <<< fa;}
awk: illegal statement at source line 1

我基本上是一个python人,有人给了我这个剧本。我在这里做错了什么?

我意识到我不清楚,所以我粘贴了我从某人那里得到的整个代码。输入文件和所需的输出保持不变

mkdir split_genome;
cd split_genome;
awk 'BEGIN{filename="file1"}{if( ~ />/){filename=; sub(/>/,"",filename); print filename;} print [=13=] >filename.fa;}' ../genome.fa;
ls -1 `pwd`/* > ../scaffold_list.txt;
cd ..;

试试这个打印不是由 > 开始的行,并且在一行中:

awk '!/^>/{printf [=10=]}' genome.fa > filename.fa

带马车return:

awk '!/^>/' genome.fa > filename.fa

创建由 headers 命名的单个文件:

awk 'split([=12=],a,"^>")>1{file=a[2];next}{print >file}' genome.fa

您显示的 awk 代码试图做一些与产生您想要的输出不同的事情。幸运的是,有更简单的方法来获得您想要的输出。例如:

$ grep -v '>' ../genome.fa
AGGAAGTGTGAGATTGAAAAAACATTACTATTGAGGAATTTTTGACCAGATCAGAATTGAACCAACATGATGAAGGGGAT
TGTTTGCCATCAGAATATGGCATGAAATTTCTCCCCTAGATCGGTTCAAGCTCCTGTAGGTTTGGAGTCCTTAGTGAGAA
CTTTCTTAAGAGAATCTAATCTGGTCTGTTCCTCGTCATAAGTTAAAGAAAAACTTGAAACAAATAACAAGCATGCATAA
TTACCCTCTACCAGCACCAATGCCTATGATCTTACAAAAATCCTTAATAAAAAGAAATCCAAAACCATTGTTACCATTCC
GGAATTACATTCTGAGATAAAAACCCTCAAATCTGAATTACAATCCCTTAAACAAGCCCAACAAAAAGACTCTGCCATAC

或者,如果您打算将所有 non-header 行连接成一行:

$ sed -n '/^>/!H; $!d; x; s/\n//gp' ../genome.fa
AGGAAGTGTGAGATTGAAAAAACATTACTATTGAGGAATTTTTGACCAGATCAGAATTGAACCAACATGATGAAGGGGATTGTTTGCCATCAGAATATGGCATGAAATTTCTCCCCTAGATCGGTTCAAGCTCCTGTAGGTTTGGAGTCCTTAGTGAGAACTTTCTTAAGAGAATCTAATCTGGTCTGTTCCTCGTCATAAGTTAAAGAAAAACTTGAAACAAATAACAAGCATGCATAATTACCCTCTACCAGCACCAATGCCTATGATCTTACAAAAATCCTTAATAAAAAGAAATCCAAAACCATTGTTACCATTCCGGAATTACATTCTGAGATAAAAACCCTCAAATCTGAATTACAATCCCTTAAACAAGCCCAACAAAAAGACTCTGCCATAC

如果您只想生成问题中显示的所需输出,其他解决方案也可以。

但是,您的脚本试图将每个序列打印到一个文件中,该文件使用其 header 和扩展名 .fa.

命名

您得到的语法错误是因为 filename.fa 既不是变量也不是固定字符串。虽然没有 Awk 允许您打印到 filename.fa,因为它既不在引号中也不是变量(可变名称中不能有 .),BSD Awk 不允许在当前字符串时操作字符串在 GNU Awk 中充当文件名。

所以解决方案:

print [=10=] > filename".fa"

在 BSD Awk 中会产生相同的错误,但在 GNU Awk 中会起作用。

要解决此问题,您可以在分配时将扩展名 ".fa" 附加到 filename

这将完成工作:

$ awk '{if([=11=] ~ /^>/) filename=substr([=11=], 2)".fa"; else print [=11=] > filename}' file
$ cat Potrs164783.fa
AGGAAGTGTGAGATTGAAAAAACATTACTATTGAGGAATTTTTGACCAGATCAGAATTGAACCAACATGATGAAGGGGAT
TGTTTGCCATCAGAATATGGCATGAAATTTCTCCCCTAGATCGGTTCAAGCTCCTGTAGGTTTGGAGTCCTTAGTGAGAA
CTTTCTTAAGAGAATCTAATCTGGTCTGTTCCTCGTCATAAGTTAAAGAAAAACTTGAAACAAATAACAAGCATGCATAA
$ cat Potrs164784.fa
TTACCCTCTACCAGCACCAATGCCTATGATCTTACAAAAATCCTTAATAAAAAGAAATCCAAAACCATTGTTACCATTCC
GGAATTACATTCTGAGATAAAAACCCTCAAATCTGAATTACAATCCCTTAAACAAGCCCAACAAAAAGACTCTGCCATAC

您会注意到我省略了 BEGIN{filename="file1"} 声明语句,因为它是不必要的。此外,我使用字符串函数 substr 替换了对 sub(...) 的需求,因为它更清晰并且需要更少的操作。