Как подсчитать количество слов из строки, используя оболочку
Я хочу подсчитать количество слов из строки, используя Shell.
Предположим, что строка:
input="Count from this String"
Здесь разделитель - это пробел ' '
, а ожидаемый результат - 4.
В строке ввода также могут быть символы пробега, такие как "Count from this String "
.
Если в String есть конечное пространство, он должен выдавать тот же результат, что и 4. Как я могу это сделать?
Ответы
Ответ 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