Як рахувати текстові рядки?


14

Як підрахувати, скільки рядків у текстовому файлі. наприклад:

command file.txt

Зауважте, я хочу рахувати лише непорожні рядки (рядки без підрахунку пробілів та вкладок) ?.



4
Питання не є чітко визначеним: чи вважається порожнім рядок із лише пробілами (пробіли та TAB)?
Рмано

Закриті виборці : Питання відредаговано після роз'яснення @ Рмано відповідно до його коментаря ОП. Тому, будь ласка, не голосуйте, щоб закрити як Незрозуміло
αғsnιη

2
@KasiyA досі незрозуміло. Я не розумію, чи хоче ОП рахувати лінію з лише пробілами (пробілами, вкладками \r) або пропускати їх. Поточний відповіді на всі підрахунки рядків з пробілами і лише пропущення порожніх.
тердон

@terdon OP НЕ хочу підраховувати порожні рядки (включаючи порожні рядки ( \rабо \n), рядки-з-тільки-вкладками та рядки-з-лише пробілами) і хочу пропустити їх, як я думаю, і відповів відповідно до що я зрозумів.
αғsnιη

Відповіді:


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.


1
Обидва ваші приклади будуть рахувати порожні рядки, але ОП попросив команду підрахувати все, АЛЕ порожні рядки
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

3
Я також хотів би ^\s*$врахувати рядки, що містять лише вкладки або пробіли.
Сільвен Піно

@SylvainPineau: Додано ..
heemayl

1
Я погоджуюся, що це не було зрозуміло з питання ОП, але текст із пробілами / вкладкою може змінити очікуваний результат, +1.
Сільвен Пано


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} .


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.