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