我进行了搜索,但找不到解决我的问题的方法。我有一个包含字母A
、T
、C
和G
(代表 DNA 序列)字符串的文件,如下所示:
$ cat species_gene
>genus_1_species_1
TTGGATATTGAGTTACATACATATGATTTGGGAATGGAGAACCGAGATAAGACTGAAGATCAAGTCACAATTGATTGTGC
TAATGCTGTCAAGAAATACAATGTCGGCATCAAATGTGCAACTATTACTCCTGATGAAAATCGAGTTGAGGAGTTCAAGC
>tribe_1_species_1
CTGGATATAGAGTTGCACACATACGATCTGGGAATGGAAAACCGCGACAAGACTGATGACCAAGTCACAATCGATTGCGC
CAACGCGATTAAAAAATACAACGTTGGAATTAAGTGCGCGACCATCACTCCCGACGAGAAGAGAGTCGAGGAATTCAAGC
>species_2
CTTGATATTGAACTACACACCTATGATTTGGGAATGGAATACCGCGATAAAACTGATGACCAAGTCACAATTGACTGCGC
KAATGCTATTAAGAAATACAATGTTGGTATTAAGTGCGCTACCATAACTCCAGATGAAAAAAGAGTTGAAGAATTCAAAC
我想计算标题后面>genus_1_species_1
直到下一个标题的字符串中的字母数量。在本例中,以下字符串的长度等于 160:
TTGGATATTGAGTTACATACATATGATTTGGGAATGGAGAACCGAGATAAGACTGAAGATCAAGTCACAATTGATTGTGC
TAATGCTGTCAAGAAATACAATGTCGGCATCAAATGTGCAACTATTACTCCTGATGAAAATCGAGTTGAGGAGTTCAAGC
我想使用 awk 并用作>
记录分隔符和换行符作为字段分隔符,然后从记录的第二行开始计算字段(即行)的数量。我使用了以下命令:
$ awk 'BEGIN {RS=">"} NR==2 {print length}' species_gene
我得到了180(第一条记录的字符数)。我想要得到的输出是 160(第一条记录的长度,从第二行开始)。我尝试了以下一种方法来丢弃标头:
$ awk 'BEGIN {RS=">"; FS="\n"} NR==2 {if (NF!=1) {length}}' species_gene
如果有人能帮助我,我会很高兴。
答案1
恕我直言,使用空行作为记录分隔符会更自然。在这种“段落模式”中,awk 包含换行符作为字段分隔符,因此在您的情况下,记录的每一行都成为一个字段。然后,您可以通过为其分配空字符串来删除第一个字段;这有一个很好的副作用,即使用给定的输出字段分隔符重新评估整个记录:通过将其设置为空字符串,剩余的字段将被连接。然后您可以简单地打印记录的长度。
awk 'BEGIN {RS="";OFS=""} NR==1 {$1=""; print length}' species_gene
使用给定的输入进行测试
$ awk 'BEGIN {RS="";OFS=""} NR==1 {$1=""; print length}' species_gene
160
答案2
length
在 awk 中不仅是一个变量,而且是一个函数:
$ awk 'BEGIN {RS=">"} NR==2 {print length($2) + length($3)}' species_gene
160
就是这样:添加两个字段的长度,而不是使用整个记录的长度。
较短:
$ awk 'BEGIN {RS=">"} NR==2 {print length($2 $3)}' species_gene
160
同样长:
$ awk 'BEGIN {RS=">"} NR==2 && $0 = length($2 $3)' species_gene
160