Я пробовал другие ответы, перечисленные выше, но они очень далеки от приличных решений при работе с большими файлами - особенно когда размер одной строки занимает более ~ 1/4 доступной оперативной памяти.
И bash, и awk отрывают всю строку, хотя для этой задачи это не нужно. Bash выдаст ошибку, если строка слишком длинная, даже если у вас достаточно памяти.
Я реализовал чрезвычайно простой, довольно неоптимизированный скрипт на python, который при тестировании с большими файлами (~ 4 ГБ на строку) не прерывается и является гораздо лучшим решением, чем приведенные.
Если это критичный ко времени код для производства, вы можете переписать идеи на C или выполнить более эффективную оптимизацию вызова read (вместо того, чтобы читать только один байт за раз), после проверки того, что это действительно узкое место.
В коде предполагается, что перевод строки - это символ перевода строки, что является хорошим предположением для Unix, но YMMV в Mac OS / Windows. Убедитесь, что файл заканчивается переводом строки, чтобы число символов в последней строке не пропускалось.
from sys import stdin, exit
counter = 0
while True:
byte = stdin.buffer.read(1)
counter += 1
if not byte:
exit()
if byte == b'\x0a':
print(counter-1)
counter = 0