한 단어에 글자가 몇 번이나 등장하나요?

한 단어에 글자가 몇 번이나 등장하나요?

단어에서 각 문자가 나타나는 횟수를 찾고 싶습니다. 예를 들어

입력하다
aabbbddd 
산출
a@2 b@3 c@0 d@3

쉘 스크립트를 사용하여 이 작업을 어떻게 수행할 수 있습니까?

답변1

sed, uniq및 다음을 사용할 수 있습니다 sort.

$ echo -n "aabbbddd" | sed 's/\(.\)/\1\n/g'| sort | uniq -c
  2 a
  3 b
  3 d

위의 코드는 sed각 문자를 가져와 자체 + 개행 문자( )로 바꿉니다 \n. 이제 각 문자가 개행 문자에 있고 정렬되었으므로 이를 사용하여 uniq -c문자 수를 계산할 수 있습니다.

노트:이 방법은 사이에 0번 발생하는 문자를 표시하지 않습니다.

또는 각 문자의 개수를 표시합니다.

$ s="aabbbddd"; for i in {a..z}; do
     v=$(echo -n "$s" | grep -oi $i | wc -l); echo "$i : $v"; done
a : 2
b : 3
c : 0
d : 3
e : 0
f : 0
g : 0
h : 0
i : 0
j : 0
k : 0
l : 0
m : 0
n : 0
o : 0
p : 0
q : 0
r : 0
s : 0
t : 0
u : 0
v : 0
w : 0
x : 0
y : 0
z : 0

이는 알파벳의 모든 문자를 반복하여 수행됩니다.

 for i in {a..z}; do .... ; done

루프를 반복할 때마다 문자열을 통해 특정 문자를 찾고 일치하는 항목만 반환하는 -o옵션을 사용합니다. 그런 다음 발견된 각 문자의 발생 횟수를 grep세어 변수에 저장합니다 . 그런 다음 각 반복을 표시합니다.wc -l$v

 echo "$i : $v"

노트:이 메서드는 순서가 잘못된 문자열을 처리할 수 있습니다.

답변2

이러한 솔루션은 대소문자를 구분하지 않습니다.

start cmd:> echo aabbbddd | 
  awk -v FS= '{for (i=1;i<=NF;i++) a[tolower($i)]++;}; 
    END {for (key in a) print key ": " a[key];}'
a: 2
b: 3
d: 3

또는 완전한 알파벳의 경우:

start cmd:> echo Aabbbddd | 
  awk -v FS= '{for (i=1;i<=NF;i++) a[tolower($i)]++;};
    END {chars="abcdefghijklmnopqrstuvwxyz";
    for (i=1;i<27;i++) { key=substr(chars,i,1);print key ": " a[key]};}'
a: 2
b: 3
c: 
d: 3
e: 
f: 
g: 
h: 
i: 
j: 
k: 
l: 
m: 
n: 
o: 
p: 
q: 
r: 
s: 
t: 
u: 
v: 
w: 
x: 
y: 
z:

답변3

쉘만 사용(짧은 문자열의 경우 더 빠름):

#! /bin/bash -
input=${*:-'aabbbddd'}

tmp=$input
arr=()
maxlen=0
maxchar=''
while ((${#tmp})); do
    firstchar=${tmp:0:1}
    next=${tmp//"$firstchar"}
    len=$((${#tmp}-${#next}))
    arr+=("$firstchar: $len")
    if ((maxlen<len)); then
    maxlen=$len
    maxchar=$firstchar
    fi
    tmp=$next
done

printf '%s\n' "${arr[@]}" 
echo "The char \"$maxchar\" appear $maxlen times in \"$input\""

라고 불리는:

$ ./script
a@2 b@3 d@3 
The char "b" appear 3 times in "aabbbddd"

관련 정보