Я ищу команду для подсчета количества всех слов в файле. Например, если файл такой,
today is a
good day
тогда это должно напечатать 5, так как там есть 5слова.
Я ищу команду для подсчета количества всех слов в файле. Например, если файл такой,
today is a
good day
тогда это должно напечатать 5, так как там есть 5слова.
Ответы:
Команда wcака. подсчет слов может сделать это:
$ wc -w <file>
$ cat sample.txt
today is a
good day
$ wc -w sample.txt
5 sample.txt
# just the number (thanks to Stephane Chazelas' comment)
$ wc -w < sample.txt
5
wc -wне имеют того же определения, что и для GNU grep -w. К wcслову относится последовательность из одного или нескольких непробельных символов ( [:space:]класс символов в текущей локали). Например , foo,barи foo bar(с неразрывным пробелом) каждое один слово.
Я придумал это просто для числа:
wc -w [file] | cut -d' ' -f1
5
Мне тоже нравится wc -w < [file]подход
Наконец, для хранения только количества слов в переменной вы можете использовать следующее:
myVar=($(wc -w /path/to/file))
Это позволяет вам элегантно пропустить имя файла.
wc -w < "$file"просто номер.
Лучшее решение - использовать Perl:
perl -nle '$word += scalar(split(/\s+/, $_)); END{print $word}' filename
@Bernhard
Вы можете проверить исходный код wcкоманды из coreutils, который я тестирую на моей машине, с файлом subst.cв исходном коде bash 4.2.
time wc -w subst.c
real 0m0.025s
user 0m0.016s
sys 0m0.000s
И
time perl -nle '$word += scalar(split(" ", $_)); END{print $word}' subst.c
real 0m0.021s
user 0m0.016s
sys 0m0.004s
Чем больше файл, тем эффективнее Perl по отношению к wc.
wcзанял ~ 14сек, в то время как Perl занял ~ 5сек!
split/\s+/split(' ') (split(" ", $_))echo -e "unix\n linux" > testfile
wcбудет значительно быстрее, как и с PERLIO=:utf8, perlбудет значительно медленнее.
$ function wordfrequency() { awk 'BEGIN { FS="[^a-zA-Z]+" } { for (i=1; i<=NF; i++) { word = tolower($i) words[word]++ } } END { for (w in words) printf("%3d %s\n", words[w], w) } ' | sort -rn }
$ cat your_file.txt | wordfrequency
Здесь указана частота каждого слова, встречающегося в предоставленном файле. Я знаю, что это не то, что вы просили, но лучше! Если вы хотите увидеть вхождения вашего слова, вы можете просто сделать это:
$ cat your_file.txt | wordfrequency | grep yourword
Я даже добавил эту функцию в моей .dotfiles
Источник: AWK-опека Руби
В wcпрограмме подсчитывает «слова», но таковыми не являются, например , «слова» , что многие люди видят , когда они рассматривают файл. viПрограмма, например , использует другую меру «слова», ограничивающие их на основе их классов персонажей, а wcпросто подсчитывает вещи , разделенные пробелами . Эти две меры могут быть радикально разными. Рассмотрим этот пример:
first,second
viвидит три слова ( первое и второе, а также запятую, разделяющую их), а wcвидит одно (на этой строке нет пробелов). Есть много способов считать слова, некоторые из них менее полезны, чем другие.
В то время как Perl будет лучше подходит для написания счетчик для слов ви-стиля, вот быстрый пример использования sed, trи wc(умеренно портативный , используя буквенные символы возврата каретки ^M):
#!/bin/sh
in_words="[[:alnum:]_]"
in_punct="[][{}\\|:\"';<>,./?\`~!@#$%^&*()+=-]"
sed -e "s/\($in_words\)\($in_punct\)/\1^M\2/g" \
-e "s/\($in_punct\)\($in_words\)/\1^M\2/g" \
-e "s/[[:space:]]/^M/g" \
"$@" |
tr '\r' '\n' |
sed -e '/^$/d' |
wc -l
Сравнение количества:
wcдает 28.Для справки, POSIX vi говорит:
В локали POSIX vi распознает пять видов слов:
Максимальная последовательность букв, цифр и подчеркиваний, разделенных на обоих концах:
Символы, отличные от букв, цифр или подчеркиваний
Начало или конец строки
Начало или конец буфера редактирования
Максимальная последовательность символов, кроме букв, цифр, символов подчеркивания или символов, разделенных на обоих концах:
- Буква, цифра, подчеркивание
<blank>персонажи- Начало или конец строки
- Начало или конец буфера редактирования
Одна или несколько последовательных пустых строк
Первый символ в буфере редактирования
Последний не
<newline>в буфере редактирования
wc -w $FILE?