Подсчет количества символов в файле через скрипт оболочки - PullRequest
61 голосов
/ 17 февраля 2011

Я хочу проверить количество символов в файле от начала до символа EOF. Может кто-нибудь сказать мне, как это сделать с помощью сценария оболочки

Ответы [ 8 ]

94 голосов
/ 17 февраля 2011

Это сделает это:

wc -c filename

Если вы хотите, чтобы только счет без повторения имени файла в выводе:

wc -c < filename

Редактировать:

Используйте -m для подсчета символов вместо байтов (как показано в ответе Себастьяна).

23 голосов
/ 17 февраля 2011
#!/bin/sh

wc -m $1 | awk '{print $1}'

wc -m подсчитывает количество символов;команда awk печатает только количество символов, без имени файла.

wc -c даст вам количество байтов (которое может отличаться от количества символов, в зависимости от кодировки, которую вы можетеиметь символ, закодированный в несколько байтов).

4 голосов
/ 02 апреля 2012
awk '{t+=length($0)}END{print t}' file3
3 голосов
/ 09 февраля 2015

Чтобы получить точное количество символов строки, используйте printf, в отличие от echo, cat или запуска wc -c непосредственно для файла, потому что использование echo, cat и т. Д. Будет считать символ новой строки, который даст вам суммусимволов, включая символ новой строки.Таким образом, файл с текстом 'hello' напечатает 6, если вы используете echo и т. Д., Но если вы используете printf, он вернет точные 5, потому что нет элемента новой строки для подсчета.

Как использовать printf для подсчетасимволы в строках:

$printf '6chars' | wc -m
6

Чтобы превратить это в скрипт, который вы можете запустить в текстовом файле для подсчета символов, сохраните следующее в файле с именем print-character-amount.sh:

#!/bin/bash
characters=$(cat "$1")
printf "$characters" | wc -m

chmod + x в файле print-character-amount.sh, содержащем приведенный выше текст, поместите файл в вашу переменную PATH (например, / usr / bin / или любой каталог, экспортированный как PATH в файл .bashrc), а затем запустите скриптТип текстового файла:

print-character-amount.sh file-to-count-characters-of.txt
1 голос
/ 17 февраля 2011

только awk

awk 'BEGIN{FS=""}{for(i=1;i<=NF;i++)c++}END{print "total chars:"c}' file

только оболочка

var=$(<file)
echo ${#var}

Рубин (1,9 +)

ruby -0777 -ne 'print $_.size' file
0 голосов
/ 29 ноября 2018

Кредиты для user.py и др.


echo "ää" > /tmp/your_file.txt
cat /tmp/your_file.txt | wc -m

приводит к 3.

В моем примере ожидаемый результат будет 2 (в два раза большеписьмо ä).Однако echo (или vi) добавляет разрыв строки \n в конец вывода (или файла).Таким образом, два ä и один разрыв строки Linux \n подсчитываются.Это три вместе.

Работа с трубами | - не самый короткий вариант, но я должен знать меньше wc параметров наизусть.Кроме того, по моему опыту cat является пуленепробиваемым.

Протестировано на Ubuntu 18.04.1 LTS (Bionic Beaver).

0 голосов
/ 09 февраля 2015

Я бы подумал, что было бы лучше использовать stat, чтобы найти размер файла, так как файловая система уже знает это, а не заставлять весь файл читать с awk или * 1003. * - особенно, если это файл размером несколько ГБ или файл, который может быть нерезидентным в файловой системе на HSM.

stat -c%s file

Да, я допускаю, что он не учитывает многобайтовые символы, но добавил бы, что OP никогда не выяснял, было ли это / было проблемой.

0 голосов
/ 30 января 2013

Следующий скрипт протестирован и дает именно те результаты, которые ожидаются

\#!/bin/bash

echo "Enter the file name"

read file

echo "enter the word to be found"

read word

count=0

for i in \`cat $file`

do

if [ $i == $word ]

then

count=\`expr $count + 1`

fi

done

echo "The number of words are $count"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...