【问题标题】:Concatenating lines using awk使用 awk 连接行
【发布时间】:2015-08-04 12:52:38
【问题描述】:

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

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

>Potrs164783
AGGAAGTGTGAGATTGAAAAAACATTACTATTGAGGAATTTTTGACCAGATCAGAATTGAACCAACATGATGAAGGGGAT
TGTTTGCCATCAGAATATGGCATGAAATTTCTCCCCTAGATCGGTTCAAGCTCCTGTAGGTTTGGAGTCCTTAGTGAGAA
CTTTCTTAAGAGAATCTAATCTGGTCTGTTCCTCGTCATAAGTTAAAGAAAAACTTGAAACAAATAACAAGCATGCATAA
>Potrs164784
TTACCCTCTACCAGCACCAATGCCTATGATCTTACAAAAATCCTTAATAAAAAGAAATCCAAAACCATTGTTACCATTCC
GGAATTACATTCTGAGATAAAAACCCTCAAATCTGAATTACAATCCCTTAAACAAGCCCAACAAAAAGACTCTGCCATAC

期望的输出

AGGAAGTGTGAGATTGAAAAAACATTACTATTGAGGAATTTTTGACCAGATCAGAATTGAACCAACATGATGAAGGGGAT
TGTTTGCCATCAGAATATGGCATGAAATTTCTCCCCTAGATCGGTTCAAGCTCCTGTAGGTTTGGAGTCCTTAGTGAGAA
CTTTCTTAAGAGAATCTAATCTGGTCTGTTCCTCGTCATAAGTTAAAGAAAAACTTGAAACAAATAACAAGCATGCATAA
TTACCCTCTACCAGCACCAATGCCTATGATCTTACAAAAATCCTTAATAAAAAGAAATCCAAAACCATTGTTACCATTCC
GGAATTACATTCTGAGATAAAAACCCTCAAATCTGAATTACAATCCCTTAAACAAGCCCAACAAAAAGACTCTGCCATAC

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

awk 'BEGIN{filename="file1"}{if($1 ~ />/){filename=$1; sub(/>/,"",filename); print filename;} print $0 >filename.fa;}' ../genome.fa

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

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

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

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

【问题讨论】:

  • 显示你想要的输出。不要让我们猜测“连接其余行并输出该序列” 的真正含义。
  • 改用print $0 &gt; filename".fa"
  • @John1024 我现在已经添加了所需的输出
  • @upendra,EtanReisner 的修复使您的代码对我有用。但是,该代码的输出与您想要的输出不匹配。
  • 您希望标题之间的所有行连接到一行,还是希望文件中没有标题的所有行连接到一行?您得到的脚本正在尝试将标题之间的每个序列打印到具有标题基本名称的文件中。这是你想要的吗?

标签: awk concatenation


【解决方案1】:

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

但是,您拥有的脚本正在尝试将每个序列打印到使用其标题和扩展名 .fa 命名的文件中。

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

所以解决办法:

print $0 > filename".fa"

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

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

这样就可以了:

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

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

【讨论】:

    【解决方案2】:

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

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

    或者,如果您打算将所有非标题行连接成一行:

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

    【讨论】:

      【解决方案3】:

      试试这个来打印不是由&gt;开始的行并且在一行中:

      awk '!/^>/{printf $0}' genome.fa > filename.fa
      

      带回车:

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

      创建以标题命名的单个文件:

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

      【讨论】:

      • 没有。 filename 是一个 awk 变量,由 &gt; 前缀行设置。
      • 可能想要添加END{print},所以文件是一个完整的行,但我不确定 OP 希望所有行都连接起来,只是标题之间的行。
      • 这不是我所理解的@EtanReisner
      • 查看原始(错误)awk 脚本。很清楚它想要做什么。
      • @EtanReisner 听起来 OP 想要的东西与他得到的脚本想要做的不同。
      猜你喜欢
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 2019-01-12
      • 2011-03-12
      • 2017-09-02
      • 2012-10-26
      相关资源
      最近更新 更多