使用 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(...)
的需求,因为它更清晰并且需要更少的操作。
我有包含两个基因序列的 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(...)
的需求,因为它更清晰并且需要更少的操作。