使用bash计算模式之间的行/字符

时间:2018-06-13 08:43:13

标签: regex linux bash

我想计算每个对象(这里GeneID:1gi|479nf|NZ_AC14)的所有字符(ACGT),以便我知道每个对象的长度(不需要计算A的数量,C的数量..)

>GeneID:1
ATGCGTTTGCGTTTGCAAATCGACTAGCTTTTGGCCCAAAGCGTGCTGCAAAAGTATGGA
AGTAAAGCTACCGTACGTAGCTAAGCCTACCGATCGATCGATCGATCGACGCCCCCCCCC
>gi|479
ATGGATTGGATGGAATCACAATTCAAGACATGTACGCATGGCTGCGACTGGAAG
>nf|NZ_AC14
ATGGCTAGATATGTCGTATGTTGGATGTTCACCATCAACAATCCCG

我有这样的多个文件,我想使用bash命令,以便一切都是自动化的,但我甚至不知道从哪里开始这样做(大多数情况下,我只会在{{ 1}})

所需的输出是:

>

但如果我只有这个数字也可以。

由于

2 个答案:

答案 0 :(得分:0)

使用awk:

awk -v RS='>[^\n]+' 'oRT{gsub("\n","");print oRT,length()}{oRT=RT}'  file

记录分隔符设置为以>开头的基因名称。通过删除换行符将记录的所有字段连接在一起。然后打印记录的长度。

变量oRT设置为捕获前一行的记录终止符RT

答案 1 :(得分:-1)

您可以使用以下awk命令:

<强> INPUT:

$ more input
>GeneID:1
ATGCGTTTGCGTTTGCAAATCGACTAGCTTTTGGCCCAAAGCGTGCTGCAAAAGTATGGA
AGTAAAGCTACCGTACGTAGCTAAGCCTACCGATCGATCGATCGATCGACGCCCCCCCCC
>gi|479
ATGGATTGGATGGAATCACAATTCAAGACATGTACGCATGGCTGCGACTGGAAG
>nf|NZ_AC14
ATGGCTAGATATGTCGTATGTTGGATGTTCACCATCAACAATCCCG

<强>命令:

awk '/^>/{if(NR>1){print tmp OFS l;} l=0; tmp=$0; next}{l+=length($0)}END{print tmp OFS l;}' input 
>GeneID:1 120
>gi|479 54
>nf|NZ_AC14 46

<强>说明:

  • /^>/{if(NR>1){print tmp OFS l;} l=0; tmp=$0; next}当您到达以>开头的行时,如果是打印tmp和{{1}的内容,则检查它不是第一行};您在ll处在该行的内容中发起0
  • tmp您可以计算其他行数,并将其添加到{l+=length($0)}
  • l当您到达文件末尾时,您打印变量内容以处理最后一组