awk计算整个文件中每个字符的出现次数

时间:2014-12-06 22:16:42

标签: awk gawk

我有一个文本文件,我想计算文件中每个字符的出现次数

以下是我的文件的示例

#1=DBD?BFHH=FIIIHIIGIHGHHIIIIIIIIGG?CHIIIAGGGHIGHEEHB@BDBCEDDDDD@CCA>?A>@C>:<?CCDDDDD@CD@DCBD9?CCDCB@
#1=DDFFFHFDHHIIIIJJIGHJIJGIIIIEGHGHJJBFGFHEIEEG@FFHJ.=EHHHABDDDBCCECEEEEDCBDEDDDDDDDDCDD?B9B:A:@?CCCD

所以输出结果为:

E - 10, C - 20, (#) - 10, 3 - 9
etc etc...

我希望我能够清楚地知道自己想要什么。

谢谢!

4 个答案:

答案 0 :(得分:1)

$ awk '{for (i=1; i<=NF; i++){a[$i]++}}END{for (i in a){print i, a[i]}}' FS= file
A 5
B 13
C 20
D 36
E 14
9 2
F 10
: 3
G 14
. 1
H 21
< 1
I 29
J 7
= 4
# 2
> 3
1 2
? 7
@ 8

答案 1 :(得分:0)

如果你需要计算所有行的字母:

sed 's/\(.\)/\1\n/g' infile|sort |uniq -c |sort -n

      1 .
      1 <
      2
      2 #
      2 1
      2 9
      3 :
      3 >

如果你需要计算每一行的字母:

awk -v FS="" '{delete a;for (i=1;i<=NF;i++) a[$i]++;for (i in a) printf "%s - %s, ",i,a[i];printf RS}' infile

A - 3, B - 7, C - 12, D - 17, E - 3, 9 - 1, F - 2, : - 1, G - 8, H - 10, < - 1, I - 18, = - 2, # - 1, > - 3, 1 - 1, ? - 5, @ - 6,
A - 2, B - 6, C - 8, D - 19, E - 11, 9 - 1, F - 8, : - 2, G - 6, . - 1, H - 11, I - 11, J - 7, = - 2, # - 1, 1 - 1, ? - 2, @ - 2,

答案 2 :(得分:0)

Perl非常适合这种事情。将文件作为单个字符串读取,删除换行符,计算字母数,输出按字母排序的结果。

perl -0777 -nE 's/\n//g; $c{$_}++ for split //; say "$_ $c{$_}" for sort keys %c' file
# 2
. 1
1 2
9 2
: 3
< 1
= 4
> 3
? 7
@ 8
A 5
B 13
C 20
D 36
E 14
F 10
G 14
H 21
I 29
J 7

答案 3 :(得分:0)

GNU awk 4.1

awk -iwalkarray '{for (;NF;NF--) b[$NF]++} END {walk_array(b)}' FS=
[A] = 5
[B] = 13
[C] = 20
[D] = 36
[E] = 14
[F] = 10
[9] = 2
[G] = 14
[:] = 3
[.] = 1
[H] = 21
[I] = 29
[<] = 1
[J] = 7
[#] = 2
[=] = 4
[1] = 2
[>] = 3
[?] = 7
[@] = 8

如果你有早期版本的GNU awk,你可以使用for (c in b) print c, b[c]。 我注意到walk_array从未在Stack Overflow上使用过,所以我做到了 为了娱乐。我在/usr/share/awk/usr/lib/gawk

找到了我的awk文件

awk save modifications in place