Как мне считать текстовые строки?

14

Как посчитать, сколько строк в текстовом файле. например:

command file.txt

Заметьте, я хочу считать только непустые строки (строки без подсчета пробелов и табуляции)?

user93097373
источник
4
Вопрос не является четко определенным: считается ли строка пустой пробелом (пробелы и TAB) пустой?
Rmano
Близкие избиратели : Вопрос отредактирован после разъяснения @ Rmano в соответствии с его комментарием ОП. Поэтому, пожалуйста, не голосуйте, чтобы закрыться как Непонятный
αғsнιη
2
@KasiyA все еще неясно. Я не понимаю, хочет ли ОП считать строку с только пробелами (пробелы, табуляции \r) или пропустить их. Ток отвечает всем счетным строкам пробелами и пропускает только пустые.
тердон
@terdon OP НЕ хочу подсчитывать пустые строки (включая пустые строки ( \rили \n), строки-только-табуляции и строки-только-пробелы) и не пропускать их, как я думаю, и отвечал согласно То, что я понял.
αғsнιη

Ответы:

11

Приведенный выше ответ верен, но немного отличается, вы можете использовать grepдля более простого кода, такогоgrep -vc '^$' file.txt

Например (A): file.txt

$grep -vc '^$' file.txt

1    First line         #This is two tabs to comment.
2    
4
3    Fourth line        #Another two tabs to comment.

$2

Например (B): file.txt

$sed '/^$/d' file.txt | wc -l

1    First line         #This is two tabs to comment.
2    
4
3    Fourth line        #Another two tabs to comment.

$4

Обратите внимание на результат 4! когда мы хотим ожидать только два. но это также учитывает вкладки между контентом и комментариями.

Обратите внимание, что отсчет от 0 до 1 отличается от grep до sed, как я помню, для более подробной информации ищите grep или sed.

amrx
источник
1
Оба ваших примера будут подсчитывать пустые строки, но OP запросил команду подсчитать все, НО пустые строки
kos
2
На самом деле , я не прав, то sedвариант на самом деле правильно, но grepодин не
кос
Будучи лишь частично верным, я понизил ответ, напишите мне комментарий, когда вы исправите его, чтобы я мог удалить свое понижающее голос
kos
1
@kos Я совершенно уверен, вы заметили, насколько неопределенным является вопрос?
amrx
2
@kos, Вы были правы в первую очередь, спасибо. Я не спал более 36 часов, наверное, пора спать!
amrx
12

Попробуй sed:

sed '/^$/d' file.txt | wc -l

Если у вас есть какие-либо строки, содержащие только пробелы или символы табуляции и если вы хотите игнорировать их также из счета:

sed '/^[[:blank:]]*$/d' file.txt | wc -l
heemayl
источник
3
Я бы также использовал, ^\s*$чтобы учитывать строки, содержащие только табуляцию или пробелы.
Сильвен Пино
@SylvainPineau: Добавлено ..
Heemayl
1
Я согласен, что это не было ясно из вопроса OP, но текст с пробелами / табуляцией может изменить ожидаемый результат, +1.
Сильвен Пино
3

Использование grep:

grep -vc '^$' file  # or
grep -vc '^\s*$' file    
Мур
источник
3

Ты можешь использовать:

grep -cve '^\s*$' file.txt

Если вам нужна команда для этого, просто вставьте следующие строки в ваш .bashrcи перезапустите сеанс оболочки или откройте новый терминал:

count_lines()
{
    grep -cve '^\s*$' $1
}

Пример:

count_lines file.txt
42
Сильвен Пино
источник
2

С :

awk 'NF{++count} END{print count}' file

Объяснение:

NFУказывает общее количество полей, и , следовательно , это печатает только непустые строки , так как в не пустых строк NFбольше 0и имеет значение верно. Так что увеличивайте флаг подсчета, когда awk обнаружил непустые строки и печатайте последнее значение флага подсчета в конце с помощью END{print count}.

αғsнιη
источник
1

Изменить : вы можете просто добавить cопцию grepвместо того, чтобы wcобвязать все , смотрите ответ @ muru для более компактной версии


С grep:

grep -v '^$' file.txt | wc -l
кос
источник
0

Perl решение

Perl может сделать это. В общем случае подсчет строк работает так:

$ perl -ne 'END{print $.}' input.txt                                                                                     

Если мы хотим исключить все пустые строки, мы сделаем что-то вроде этого:

$ perl -ne '$c+=1 if not /^$|^\s+$/;END{print $c}' input.txt                                                             

Допустим, у нас есть входной файл, как это

$ cat -n input.txt
     1  Cat; Dog; Squirrel
     2  ORGANISM Animalus terrus
     3  
     4  Sequence: ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT
     5  

Всего 5 строк, 2 пустых строки. Команда, которую мы имеем, выведет:

$ perl -ne '$c+=1 if not /^$|^\s+$/;END{print $c}' input.txt                                                             
3

Многофайловое улучшение

Это хорошо работает для одного файла. Если мы хотим, чтобы он работал с несколькими файлами, мы можем сделать что-то вроде этого:

$ perl -ne '$c+=1 if not /^$|^\s+$/;printf("%d %s\n",$c,$ARGV) and $c=0 if eof' input.txt /etc/passwd                    
3 input.txt
52 /etc/passwd
Сергей Колодяжный
источник