计算文本行中的出现次数

Count occurrences in a text line

有什么方法可以计算一个值在一行中出现的频率吗?。我的输入是制表符分隔的 .txt 文件。它看起来像这样(但有数千行):

  #N/A  14 13   #N/A    15 13   #N/A    14 13   13 15   14 13   15 14   14 15
    24 26   #N/A    24 22   #N/A    24 26   #N/A    24 26   24 22   24 22   24 26
    45 43   45 43   #N/A    #N/A    #N/A    43 45   45 43   #N/A    47 45   45 43

我想要这样或类似的输出。

 #N/A(3)  14 13(3)  15 13(1)  13 15(1)  15 14(1)  14 15 (1)
 24 26(4)  #N/A(3)  24 22(3)   
 45 45(4)  #N/A(4)  43 45(1)  47 45(1)

awk 救援!

$ awk -F'  +' -v OFS='  ' '{for(i=1;i<=NF;i++) if($i!="")a[$i]++; 
        for(k in a) printf "%s", k"("a[k]")" OFS; delete a; print ""}' file

#N/A(3)  14 13(3)  13 15(1)  15 13(1)  14 15(1)  15 14(1)
#N/A(3)  24 22(3)  24 26(4)
#N/A(4)  43 45(1)  45 43(4)  47 45(1)

Perl 解决方案:

perl -laF'/\t/' -ne '
    chomp; my %h;
    $h{$_}++ for @F;
    print join "\t", map "$_ ($h{$_})", keys %h
' < input
  • -a-F 上的每一行(\t 表示制表符)拆分为 @F 数组
  • -l 在打印中添加换行符
  • -n逐行读取输入
  • chomp 删除最后的换行符
  • %h 是一个散列table,键是@F 的成员,值是计数