Bash 使用awk在fasta标题中保留分隔符后的文本
我有一个应该很简单的问题,但我缺乏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 我想清理每个标题(以“>”开头的行),只保留信息部分,即第二个“_位点*”,带
>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