【问题标题】:Extract the number of specific characters from a text file using awk使用 awk 从文本文件中提取特定字符的数量
【发布时间】:2012-07-18 02:15:00
【问题描述】:

我有一个看起来像这样的文本文件。我想提取“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 做到这一点?

【问题讨论】:

    标签: awk


    【解决方案1】:

    一种方式。当找到以> 开头的行时,读取下一行,将其保存在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
    

    【讨论】:

      【解决方案2】:

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

      {
        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
      

      以前的解决方案

      {
        if ($1 ~ /^>/)
          printf("\n%s\n", $0)
        else
        {
          print "total number of A - ", gsub(/A/,"A")
          print "total number of E - ", gsub(/E/,"E")
        }
      }
      

      类似于@Birei的

      【讨论】:

      • 改变FS背后的想法是什么?
      • @KarlNordström 已发布工作解决方案 .. 我知道这可以通过 FS 实现 .. 只需要正确排序即可。
      • @KarlNordström 对不起所有的消息,我以为你是 OP .. 道歉。
      • 我不是要给人这样的印象。我只是好奇。
      • +1 用于在 BEGIN 块之外修改 FS 的不太常见(工作)解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      相关资源
      最近更新 更多