Есть ли способ подсчитать количество строк текста в файле, включая строки без разделителей?

Это может быть ваша команда. Это скрипт, который берет имя файла в командной строке и выводит в нем все строки, содержащие ровно семь символов :

.
#!/bin/sh
grep -c '^.......$' "$1"

Вы должны сделать приведенный выше скрипт исполняемым (с чем-то вроде chmod +x script.sh), а затем запустить его с ./script.sh file, где file— это имя файла, который вы хотите изучить.

Команда

grep -c '^.......$'

выведет количество строк в заданном файле, содержащих ровно семь символов (, включая пробелы ).

Можно сократить до

grep -cEx '.{7}'

-Eне требуется, поскольку выражение теперь является расширенным регулярным выражением .Флаг -xзаставит выражение соответствовать полной строке.

Если вы не хотите считать пробелы и вас интересуют только «словные символы» (буквенно-цифровые символы ), вы можете использовать

grep -cExw '.{7}'

Флаг -wдля grepзаставит совпадение быть "словом" (строкой буквенно-цифровых символов, разделенных не -буквенно-цифровыми символами ).

Если вы хотите подсчитать, сколько существует уникальных строк, которые соответствуют этому критерию (вот как я интерпретирую «разные строки» ), затем передайте результат grepбез -cфлаг через uniqи wc -l. Это подсчитает количество уникальных строк, содержащих ровно семь символов слова.

grep -Exw '.{7}' | uniq | wc -l

В сценарии это становится

grep -Exw '.{7}' "$1" | uniq | wc -l
4
13.08.2019, 11:48
2 ответа

Вы можете использовать для этого awk, которая имеет специальную переменную NR, которая отслеживает номер текущей записи с начала файла. Переменная увеличивается в конце каждой строки. При печати в блоке END, т.е. после обработки всех входных строк, печатается номер последней обработанной записи.

printf "aa\nbb" | awk 'END { print NR }'
2

printf "aa\nbb\n" | awk 'END { print NR }'
2
4
27.01.2020, 20:47

С GNU sedвы можете использовать:

sed '$=;d'

Поскольку GNU sedсчитает эти дополнительные символы после последней новой строки дополнительной строкой. GNU sed, как и большинство утилит GNU, также поддерживает символы NUL в своем вводе и не имеет ограничения на длину строк (два других критерия, которые делают ввод не -текстом согласно POSIX ).

POSIXly, построение -на основе ответа @Inian для поддержки слишком -длинных строк и нулевых байтов:

LC_ALL=C tr -cs '\n' '[x*]' | awk 'END {print NR}'

Эта команда trпереводит все последовательности из одного или нескольких символов, (каждый байт интерпретируется как символ в локали C, чтобы избежать проблем с декодированием, )кроме новой строки, в одинxсимвол, поэтому Входные записи awkбудут иметь длину 0 или 1 байт, а его входные данные будут содержать только xи символы новой строки.

$ printf '%10000s\na\0b\nc\nd' | wc -l
3

$ printf '%10000s\na\0b\nc\nd' | mawk 'END{print NR}'
2
$ printf '%10000s\na\0b\nc\nd' | busybox awk 'END{print NR}'
5
$ printf '%10000s\na\0b\nc\nd' | gawk 'END{print NR}'
4

$ printf '%10000s\na\0b\nc\nd' | LC_ALL=C tr -cs '\n' '[x*]' | mawk 'END{print NR}'
4
7
27.01.2020, 20:47

Теги

Похожие вопросы