awk - 跳过第一行记录

awk - 跳过第一行记录

我进行了搜索,但找不到解决我的问题的方法。我有一个包含字母ATCG(代表 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

答案3

可能的微小改进你的进步钢铁司机的回答

awk -vRS=">" -vOFS="" '$1=="genus_1_species_1" {$1=""; print length;}' species_gene

The-vRS=">"相当于BEGIN {RS=">"},并且同样与-vOFS=""。我的贡献是这个版本允许您指定记录的标题其长度,因此您不必计算记录。

相关内容