Как печатать несколько символов в каждой строке текстового файла


Я хочу вывести количество символов в каждой строке текстового файла с помощью команды Unix. Я знаю, что это просто с powershell

gc abc.txt | % {$_.length}

но мне нужна команда unix.

5 53

5 ответов:

Использовать Awk.

awk '{ print length(); }' abc.txt
while read -r line; do echo ${#line}; done < abc.txt

это POSIX, поэтому он должен работать везде.

Edit: добавлено-r, как предложил Уильям.

вот пример использования xargs:

$ xargs -I% sh -c 'echo % | wc -c' < file

Я пробовал другие ответы, перечисленные выше, но они очень далеки от достойных решений при работе с большими файлами-особенно когда размер одной строки занимает более ~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

попробуйте это:

while read line    
do    
    echo -e |wc -m      
done <abc.txt