
単語中の各アルファベットの出現回数を知りたいです。例:
入力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
文字数をカウントできます。
注記:この方法では、出現回数がゼロの文字は表示されません。
代わりに各文字の数を表示する
$ 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
ループの各反復では、文字列を grep して特定の文字を探し、-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"