Подтвердить что ты не робот

Как подсчитать количество слов из строки, используя оболочку

Я хочу подсчитать количество слов из строки, используя Shell.

Предположим, что строка:

input="Count from this String"

Здесь разделитель - это пробел ' ', а ожидаемый результат - 4. В строке ввода также могут быть символы пробега, такие как "Count from this String ".

Если в String есть конечное пространство, он должен выдавать тот же результат, что и 4. Как я могу это сделать?

4b9b3361

Ответ 1

echo "$input" | wc -w

Используйте wc -w для подсчета количества слов.

Или, как и в предложении dogbane, эхо также можно избавиться:

wc -w <<< "$input"

Если < < не поддерживается вашей оболочкой, вы можете попробовать этот вариант:

wc -w << END_OF_INPUT
$input
END_OF_INPUT

Ответ 2

Вам не нужна внешняя команда, например wc, потому что вы можете сделать это в чистом bash, что более эффективно.

Преобразуйте строку в массив и затем подсчитайте элементы в массиве:

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

В качестве альтернативы используйте set для установки позиционных параметров, а затем подсчитайте их:

$ input="Count from this String   "
$ set -- $input
$ echo $#
4

Ответ 3

Чтобы сделать это в чистом bash, избегая побочных эффектов, сделайте это в суб-оболочке:

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

Он также работает с другими разделителями:

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

Обратите внимание на использование "set -f", которое отключает bash расширение имени файла в подоболочке, поэтому, если вызывающему абоненту требуется расширение, необходимо сделать заранее (Hat Tip @mkelement0).

Ответ 4

Попробуйте следующий однострочный:

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

Он в основном определяет функцию c() и передает $input в качестве аргумента, затем $# возвращает количество элементов в аргументе, разделенных пробелами. Чтобы изменить разделитель, вы можете изменить IFS (специальную переменную).

Ответ 5

echo "$input" | awk '{print NF}'

Ответ 6

Я просто перезвоню с одним слоем perl (избегая "бесполезного использования эха" ):

perl -lane 'print scalar(@F)' <<< $input