如何使用awk按行获取唯一字符的计数?

如何使用awk按行获取唯一字符的计数?,awk,Awk,我有一个如下所示的文本文件: A A A G A A A A A A A A G A G A G G A G G G G G G A A A A A T C T C C C A A A G A A C C C C C C T G G G G G T T T T T T 我想按行计算每个字母出现的次数。有相当多的文档是按字段而不是按行执行的。我一直在想: 对于(i=1;i我不太熟悉awk,这里有一个perl版本: perl -ne 'my %c; $c{$_}++ for split; prin

我有一个如下所示的文本文件:

A A A G A A
A A A A A A
G A G A G G
A G G G G G
G A A A A A
T C T C C C
A A A G A A
C C C C C C
T G G G G G
T T T T T T
我想按行计算每个字母出现的次数。有相当多的文档是按字段而不是按行执行的。我一直在想:
对于(i=1;i我不太熟悉awk,这里有一个perl版本:

perl -ne 'my %c; $c{$_}++ for split; print scalar keys %c'
输出

212222212
如果愿意,可以添加换行符

perl -ne 'my %c; $c{$_}++ for split; print scalar keys %c . "\n"'
编辑

作为对评论的回应,也许这更像你的意思:

perl -ne 'my %c; $c{$_}++ for split; print "$_:$c{$_} " for keys %c; print "\n"'
输出:

A:5 G:1 
A:6 
A:2 G:4 
A:1 G:5 
A:5 G:1 
T:2 C:4 
A:5 G:1 
C:6 
T:1 G:5 
T:6 

在awk中,我认为没有一种更简单的方法可以迭代一行中的字段

awk '
  {
    delete a
    for (i=1; i<=NF; i++)
      a[$i]++
    printf("%d -- ", NR)
    for (val in a)
      printf("%s:%d, ", val, a[val])
    print ""
  }
'

如果您将
FS
字段分隔符设置为换行符
'\n'
,是否可以使用您找到的文档轻松解答?这将计算不同字母的数量,而不是每个字母出现的次数。
1 -- A:5, G:1, 
2 -- A:6, 
3 -- A:2, G:4, 
4 -- A:1, G:5, 
5 -- A:5, G:1, 
6 -- C:4, T:2, 
7 -- A:5, G:1, 
8 -- C:6, 
9 -- G:5, T:1, 
10 -- T:6,