Bash 使用awk在fasta标题中保留分隔符后的文本

Bash 使用awk在fasta标题中保留分隔符后的文本,bash,awk,fasta,Bash,Awk,Fasta,我有一个应该很简单的问题,但我缺乏awk知识,这让我停滞不前 我想清理以下格式的fasta文件的标题: >HWGG454_Clocus2_Locus3443_allele1 ATTCTACTACTACTCT >GHW757_clocus37_Locus555662_allele2 CTTCCCTACGATG >TY45_clocus23_Locus800_allele0 TTCTACTTCATCT 我想清理每个标题(以“>”开头的行),只保留信息部分,即第二个“_位点*”,带

我有一个应该很简单的问题,但我缺乏awk知识,这让我停滞不前

我想清理以下格式的fasta文件的标题:

>HWGG454_Clocus2_Locus3443_allele1
ATTCTACTACTACTCT
>GHW757_clocus37_Locus555662_allele2
CTTCCCTACGATG
>TY45_clocus23_Locus800_allele0
TTCTACTTCATCT
我想清理每个标题(以“>”开头的行),只保留信息部分,即第二个“_位点*”,带或不带等位基因部分

我原以为awk是一种简单的方法,但我不能让它发挥作用

如果我只想保留标题中“uu”分隔符之前的第一列文本,以及下面的序列,我会运行这个(假设这个玩具示例在test.fasta文件中):

但是,我只想保留第三个定界符后面的“Locus*”文本,但是,使用此代码我得到:

cat test.fasta | awk -F '_' '{print $3}'
Locus3443

Locus555662

Locus800
我做错了什么


谢谢。

我理解这意味着您希望从标题行中选择
轨迹
字段,而其他字段保持不变。然后:

awk -F _ '/^>/ { print $3; next } 1' filename
这也许是最简单的方法。这项工作如下:

/^>/ {      # in lines that begin with >
  print $3  # print the third field
  next      # and go to the next line.
}
1           # print other lines unchanged. Here 1 means true, and the
            # default action (unchanged printing) is performed.
这里要理解的是awk的控制流:awk代码由带有关联操作的条件组成,如果条件的计算结果为true,则执行这些操作

/^>/
是整个记录上的正则表达式匹配(默认为行);如果行的开头是
(因为
^
与开头匹配),那么

将使awk执行
打印$3;以
开头的行中的下一个
。不那么直截了当的部分是

1
打印行不变。只有当第一个动作没有执行时(因为其中的
next
),我们才能到达这里,而这个
1
将被视为一个始终为真的条件——非零值在awk中为真

现在,如果省略awk语句中的条件或操作,则使用默认值。默认操作是打印未更改的行,这将利用它。同样可以写

1 { print }


在后一种情况下,省略条件并使用默认条件“true”
1是最短的变体,因此是惯用的。

下面的行需要第二个awk匹配。e、 g

cat test.fasta | awk -F _ '/^>/ { print $3"_"$4 } /^[A-Z]/ {print $1}'
输出:

Locus3443_allele1
ATTCTACTACTACTCT
Locus555662_allele2
CTTCCCTACGATG
Locus800_allele0
TTCTACTTCATCT

如果您不想从awk脚本中删除
\u allege1
“\u4”

您只需在每一行执行一个正则表达式即可:

$ awk -F_ '{print (/^>/ ? $3 : $0)}' file
Locus3443
ATTCTACTACTACTCT
Locus555662
CTTCCCTACGATG
Locus800
TTCTACTTCATCT
$ awk '{ sub(/^.*_L/,"L"); print $0}' /tmp/fasta.txt
Locus3443_allele1
ATTCTACTACTACTCT
Locus555662_allele2
CTTCCCTACGATG
Locus800_allele0
TTCTACTTCATCT

你的预期产出是多少?
Locus3443_allele1
ATTCTACTACTACTCT
Locus555662_allele2
CTTCCCTACGATG
Locus800_allele0
TTCTACTTCATCT
$ awk -F_ '{print (/^>/ ? $3 : $0)}' file
Locus3443
ATTCTACTACTACTCT
Locus555662
CTTCCCTACGATG
Locus800
TTCTACTTCATCT
$ awk '{ sub(/^.*_L/,"L"); print $0}' /tmp/fasta.txt
Locus3443_allele1
ATTCTACTACTACTCT
Locus555662_allele2
CTTCCCTACGATG
Locus800_allele0
TTCTACTTCATCT