Как напечатать количество символов в каждой строке текстового файла - PullRequest
61 голосов
/ 09 января 2012

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

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

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

Ответы [ 6 ]

120 голосов
/ 09 января 2012

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

awk '{ print length }' abc.txt
13 голосов
/ 09 января 2012
while read -r line; do echo ${#line}; done < abc.txt

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

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

Редактировать: Остерегайтесь обработки Юникода. Bash и zsh с правильно установленной локалью покажут количество кодовых точек, но dash покажет байты - так что вы должны проверить, что делает ваша оболочка. И в любом случае, есть много других возможных определений длины в Юникоде, так что это зависит от того, что вы действительно хотите.

2 голосов
/ 12 февраля 2015

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

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

$ xargs -d '\n' -I% sh -c 'echo % | wc -c' < file
0 голосов
/ 01 февраля 2019

Не используйте AWK, используйте sed! Используя sed, вы можете смоделировать добавление полного десятичного числа :

sed -n 's/./a/g; s/^$/0/; :c /a/! be; s/^a/1/; s/0a/1/; s/1a/2/; s/2a/3/; s/3a/4/; s/4a/5/; s/5a/6/; s/6a/7/; s/7a/8/; s/8a/9/; s/9a/a0/; /a/ bc; :e p' abc.txt

Эта команда печатает количество символов в каждой строке текстового файла abc.txt.

0 голосов
/ 09 января 2012

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

while read line    
do    
    echo -e |wc -m      
done <abc.txt    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...