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