Script de shell para contar o número de caracteres maiúsculos e minúsculos em uma entrada de cadeia de caracteres

1

Sugira um script de shell para encontrar o número de letras maiúsculas e minúsculas em uma string usando valores ASCII.

    
por FortuneCookie 17.12.2017 / 10:52

5 respostas

5

perl -Mopen=locale -e '
  $_="@ARGV";
  printf "upper: %d\nlower: %d\n", y/A-Z//, y/a-z//' -- "$myvar"

Imprimiria o número de ocorrências de caracteres ABCDEFGHIJKLMNOPQRSTUVWXYZ e abcdefghijklmnopqrstuvwxyz no conteúdo de $myvar .

com zsh :

printf 'upper: %d\nlower: %d\n' ${#myvar//[^A-Z]} ${#myvar//[^a-z]}

Com ksh ou bash :

upper=ABCDEFGHIJKMLNOPQRSTUVWXYZ
lower=abcdefghijklmnopqrstuvwxyz
u=${myvar//[^$upper]} l=${myvar//[^$lower]}
printf 'upper: %d\nlower: %d\n' "${#u}" "${#l}"

POSIXly:

upper=ABCDEFGHIJKMLNOPQRSTUVWXYZ
lower=abcdefghijklmnopqrstuvwxyz
u=$(printf %s "$myvar" | tr -cd "$upper" | wc -m)
l=$(printf %s "$myvar" | tr -cd "$lower" | wc -m)
printf 'upper: %d\nlower: %d\n' "$u" "$l"

Embora tenha cuidado, algumas implementações de tr como o GNU tr não são compatíveis e podem contar partes de caracteres que têm a mesma codificação que as letras ASCII. Por exemplo, em um zh_HK.big5hkscs locale em um sistema GNU:

$ LC_ALL=zh_HK.big5hkscs luit
$ printf Э | tr -cd ABCDEFGHIJKLMNOPQRSTUVWXYZ | wc -c
1

Como lá, a codificação de Э contém a codificação de R :

$ printf Э | hd
00000000  c8 52                                             |.R|
00000002
    
por 17.12.2017 / 11:37
1
Solução

GNU awk :

s="Kyiv is the city of Archistratigus Michael ..."
awk 'BEGIN{ FPAT="[a-zA-Z]"; l=u=0 }
     {
         for (i=1; i<=NF; i++) ($i~/[a-z]/)? l++ : u++; 
         printf "upper: %d, lower: %d\n", l, u 
     }' <<<"$s"

A saída:

upper: 33, lower: 3
  • FPAT="[a-zA-Z]" - valor do campo de definição do padrão (considera apenas letras maiúsculas e minúsculas)
por 17.12.2017 / 12:18
1

Para contar o número de caracteres, você pode usar grep e um simples regex; juntamente com tr e wc

myVar="Valdeir Psr"
echo -n $myVar | grep -o [A-Z] | tr -d "\n" | wc -m

O que cada comando faz:

echo -n --> Print the value of the variable

grep -o [A-Z] --> Filters the uppercase letters

tr -d "\n" --> Removes line break

wc -m --> Print the character counts

Para contar os caracteres minúsculos, basta substituir [A-Z] por [a-z]

    
por 17.12.2017 / 11:27
0
gawk '{ print "Uppercase", patsplit($0, a, /[A-Z]/) print "Lowercase", patsplit($0, a, /[a-z]/) }' RS="oNe TWo thrEE " input.txt

Informações sobre o RS="%code%" construção - Gravar divisão com gawk .

Entrada

Uppercase 5 Lowercase 6

Saída

gawk '{ print "Uppercase", patsplit($0, a, /[A-Z]/) print "Lowercase", patsplit($0, a, /[a-z]/) }' RS="oNe TWo thrEE " input.txt     
por 17.12.2017 / 20:37
0

Para contar os caracteres minúsculos na string:

for i in {a..z}; do
  echo "Praven" | awk -v i="$i" '$1~i {print i}';
done | wc -l

Saída

5

Para localizar caracteres maiúsculos, substitua a..z por A..Z .

    
por 17.12.2017 / 16:27