Comment compter le nombre de mots de la chaîne en utilisant shell

Je veux compter le nombre de mots d'une chaîne en utilisant Shell.

Supposons que la chaîne soit:

input="Count from this String"

Ici, le délimiteur est l'espace ' ' et la sortie attendue est 4. Il peut également y avoir des caractères d'espace de fin dans la chaîne d'entrée comme "Count from this String ".

S'il y a de l'espace de fin dans la chaîne, elle devrait produire la même sortie, c'est-à-dire 4. Comment puis-je faire cela?

28
demandé sur kenorb 2013-02-27 13:17:16

6 réponses

echo "$input" | wc -w

Utilisez wc-w pour compter le nombre de mots.

Ou selon la suggestion de dogbane, l'écho peut également être éliminé:

wc -w <<< "$input"

Si

wc -w << END_OF_INPUT
$input
END_OF_INPUT
38
répondu Tuxdude 2013-02-28 19:53:14

Vous n'avez pas besoin d'une commande externe comme wc car vous pouvez le faire en pur bash ce qui est plus efficace.

Convertissez la chaîne en un tableau, puis comptez les éléments du tableau:

$ input="Count from this String   "
$ words=( $input )
$ echo ${#words[@]}
4

Vous pouvez également utiliser set pour définir des paramètres de position, puis les Compter:

$ input="Count from this String   "
$ set -- $input
$ echo $#
4
33
répondu dogbane 2013-02-27 09:35:09

Pour le faire en pur bash en évitant les effets secondaires, faites-le dans un sous-shell:

$ input="Count from this string "
$ echo $(IFS=' '; set -f; set -- $input; echo $#)
4

Cela fonctionne aussi avec d'autres séparateurs:

$ input="dog,cat,snake,billy goat,horse"
$ echo $(IFS=,; set -f; set -- $input; echo $#)
5
$ echo $(IFS=' '; set -f; set -- $input; echo $#)
2

Notez l'utilisation de "set-f" qui désactive Bash filename expansion dans le sous-shell, donc si l'appelant veut une expansion, il doit être fait à l'avance (Hat Tip @mkelement0).

5
répondu qneill 2017-10-02 17:49:59
echo "$input" | awk '{print NF}'
4
répondu Henry Barber 2015-10-21 09:48:39

Essayez le One-liner suivant:

echo $(c() { echo $#; }; c $input)

Il définit fondamentalement la fonction c() et passe $input comme argument, puis $# renvoie le nombre d'éléments dans l'argument séparés par des espaces. Pour modifier le délimiteur, vous pouvez modifier IFS (une variable spéciale).

3
répondu kenorb 2017-04-13 12:36:30

Je vais juste jouer avec un one-liner perl (en évitant 'l'utilisation inutile de echo'):

perl -lane 'print scalar(@F)' <<< $input
0
répondu AAAfarmclub 2017-07-08 19:32:11