Я ищу команду для подсчета количества всех слов в файле. Например, если файл такой,
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
?