ファイルを繰り返して各文字の発生回数を数えるにはどうすればよいですか?

ファイルを繰り返して各文字の発生回数を数えるにはどうすればよいですか?
function count{
  declare -a array 

  for((i=0; i<256;i++)); do
    ${array[$i]}=0
  done

  while read line_in; do
    ((line_num++))

    ...(Code Needed)

    if [ $line_num == 100 ]; then 
      break
    fi
  done < "${path_in}"
(Code needed to print the counts)

ファイルの各行を繰り返し、特定の文字の発生回数を数えて印刷してこの機能を実行するにはどうすればよいですか?

テキストファイルがある場合は、ファイルを繰り返し、各行ごとに各ASCll文字の発生回数を数えて配列に保存したいと思います。次に、配列内の各要素の数を出力します。大文字と小文字は同じように扱われます。

入力する:

Hello 
world 

予想出力:

D:1
H:1
E:1
L:3
O:2
R:1
W:1

答え1

私は次のようなものを選択します。

grep -o . file | sort | uniq -c

  1 d
  1 e
  1 H
  3 l
  2 o
  1 r
  1 W

または、大文字と小文字を単一文字として扱う場合:

grep -o . file | sort | uniq -ic | tr [:lower:] [:upper:]

  1 D
  1 E
  1 H
  3 L
  2 O
  1 R
  1 W

| tr [:lower:] [:upper:]予想される出力にすべて大文字を印刷するオプションがあります。

答え2

ファイル内の各文字数を数えるにはGNU awk

awk 'BEGIN{FS=""} {for (i=1; i<=NF; i++){a[$i]++}}END{for (i in a){print i,":", a[i]}}' file

文字を大文字と小文字を区別せずに処理するtolowerか、toupper次を使用できます。

awk 'BEGIN{FS=""} {for (i=1; i<=NF; i++){a[tolower($i)]++}}END{for (i in a){print i,":", a[i]}}' file

サンプル出力

c : 1
d : 3
e : 2
f : 2
h : 1
i : 12
l : 1
m : 1
n : 8
o : 2
p : 1
r : 4
s : 1
t : 6
u : 2
{ : 3
} : 3

答え3

他の回答を好むが、ポータブル回答がありませんので、awkを使用してください。

awk '
{
    m=1
    #$0=toupper($0)
    while(m<=length($0)){ #While there are still chars unparsed in the line
        ch=substr($0,m,1) #Get one char of the line
        cnt[ch]++         #Increment its counter
        m++               #Point to the next char
    }
}
END{for(ch in cnt)print cnt[ch],"\t",ch}
' file

大文字と小文字を区別しないようにするには、行のコメントを外します。

サンプルファイルの出力:

1        h
1        w
3        l
2        o
1        d
1        r
1        e

関連情報