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

4

Команда POSIX wcподсчитывает, сколько строк POSIX в файле. Стандарт POSIX определяет строку как текстовую строку с суффиксом \n. Без \nэтого чистая текстовая строка не может быть названа строкой.

Но для меня более естественно посчитать, сколько строк текстовой строки в файле. Есть ли простой способ сделать это?

root:[~]# printf "aa\nbb" | wc -l
1
root:[~]# printf "aa\nbb\n" | wc -l
2
root:[~]#
Просто ученик
источник
Связанный: Как добавить новую строку в конец файла? (когда файл еще не имеет).
Стивен Китт

Ответы:

7

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

sed '$=;d'

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

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

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
Стефан Шазелас
источник
4

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

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

printf "aa\nbb\n" | awk 'END { print NR }'
2
Inian
источник
2
Обратите внимание, что в некоторых awkреализациях это все еще подразумевает, что ввод не содержит символов NUL (что также сделало бы этот ввод нетекстовым согласно POSIX).
Стефан Шазелас