Как печатать несколько символов в каждой строке текстового файла
Я хочу вывести количество символов в каждой строке текстового файла с помощью команды Unix. Я знаю, что это просто с powershell
gc abc.txt | % {$_.length}
но мне нужна команда unix.
5 ответов:
while read -r line; do echo ${#line}; done < abc.txt
это POSIX, поэтому он должен работать везде.
Edit: добавлено-r, как предложил Уильям.
Я пробовал другие ответы, перечисленные выше, но они очень далеки от достойных решений при работе с большими файлами-особенно когда размер одной строки занимает более ~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