使用awk从文本文件中提取特定字符数

使用awk从文本文件中提取特定字符数,awk,Awk,我有一个像这样的文本文件。我想提取“A”和“E”字符的总数 >pr1 FSVSQNNPAE >pr2 MAKERAHSQ >pr3 RRRDKINNWIVQL 我想得到这样的输出 >pr1 Total number of A - 1 Total number of E - 1 >pr2 Total number of A – 2 Total number of E - 1 >pr3 Total number of A – 0 Total num

我有一个像这样的文本文件。我想提取“A”和“E”字符的总数

>pr1
FSVSQNNPAE
>pr2
MAKERAHSQ
>pr3
RRRDKINNWIVQL
我想得到这样的输出

>pr1 
Total number of A - 1 
Total number of E - 1   

>pr2
Total number of A – 2
Total number of E - 1

>pr3
Total number of A – 0
Total number of E – 0

如何使用awk实现此目的?

单向。当找到以
开头的行时,读取下一行,将其保存在
str
变量中,并计算每个字母的替换数

awk '
    $1 ~ /^>/ {
        getline str
        num_a = gsub( /A/, "", str )
        num_e = gsub( /E/, "", str )
        printf "%s\nTotal number of A - %d\nTotal number of E - %d\n\n", $0, num_a, num_e
    }
' infile
输出:

>pr1                                                                                                                                                                                                                                         
Total number of A - 1                                                                                                                                                                                                                        
Total number of E - 1                                                                                                                                                                                                                        

>pr2                                                                                                                                                                                                                                         
Total number of A - 2                                                                                                                                                                                                                        
Total number of E - 1                                                                                                                                                                                                                        

>pr3                                                                                                                                                                                                                                         
Total number of A - 0                                                                                                                                                                                                                        
Total number of E - 0

更新:这将通过动态更改
FS
()来实现:

{
  if ($0 ~ /^>/)
    printf("\n%s\n", $0);
  else
  {
    FS="A"
    nl = $0;
    $0 = nl;
    print "Total number of A - ", NF-1; 

    FS="E"
    $0 = nl;
    print "Total number of E - ", NF-1;
  }
}
给出:

>pr1
Total number of A -  1
Total number of E -  1

>pr2
Total number of A -  2
Total number of E -  1

>pr3
Total number of A -  0
Total number of E -  0

以前的解决方案:


类似于@Birei的

改变FS背后的想法是什么?@KarlNordström发布了工作解决方案。。我知道使用
FS
,这是可能的。。只是要把顺序弄对。@KarlNordströ我对所有的消息感到抱歉,我以为你就是那个特工。。抱歉,我不是想给人留下这样的印象。我只是好奇而已。对于一个不太常见(工作)的解决方案来说,将FS从BEGIN块中修改出来是+1。
{
  if ($1 ~ /^>/)
    printf("\n%s\n", $0)
  else
  {
    print "total number of A - ", gsub(/A/,"A")
    print "total number of E - ", gsub(/E/,"E")
  }
}