підрахунок рядків у файлі


64

Я впевнений, що існує багато способів зробити це: як я можу підрахувати кількість рядків у текстовому файлі?

$ <cmd> file.txt
1020 lines

Відповіді:


98

Стандартний спосіб - це метод wc, який бере аргументи, щоб вказати, на що він повинен рахуватись (байти, символи, слова тощо); -lпризначений для рядків:

$ wc -l file.txt
1020 file.txt

Як підрахувати рядки у файлі, якщо я хочу проігнорувати коментарі? Зокрема, я хочу не рахувати рядки, які починаються з +, деякий пробіл (не може бути пробілу), а потім%, тобто таким чином з'являються рядки коментарів у git diff файлу MATLAB. Я спробував це зробити з грепом, але не зміг зрозуміти правильний регулярний вираз.
Гдаля

@Gdalya Я сподіваюся , що наступний конвеєр буде робити це (тести не були проведеними) cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l. /regexp/dвидаляє рядок, якщо вона збігається regexp, і -eвмикає адекватний (IMNSHO) синтаксис для regexp.
dbanet

2
Чому б не просто grep -v '^+ *%' matlab.git.diff | wc -l?
celtschk

@celtschk, якщо це зазвичай у рядках коментарів: чи можна змінити вашу grepкоманду, щоб розглянути такі випадки коментарів, як " + Hello"(примітка, місця (місця) перед +)?
Sopalajo de Arrierez

1
@SopalajodeArrierez: Звичайно, це можливо: grep -v '^ *+' matlab.git.diff | wc -l(я припускаю, що цитати насправді не означали, що вони є частиною рядка; я також припускаю, що обидва рядки з пробілами та без +них мають бути коментарями; якщо в принаймні один пробіл є обов'язковим, або замінити зірку *на \+, або просто додати інший пробіл перед зіркою). Можливо, замість того, щоб відповідати лише пробілам, ви хочете зіставити довільну пробіл; для цього замініть простір на [[:space:]]. Зауважте, що я також видалив відповідність, %оскільки це не є у вашому прикладі.
celtschk

15

Як сказав Майкл, wc -lце шлях. Але, на всякий випадок , якщо ви нез'ясовно є bash, perlабо , awkале не wc, ось кілька рішень:

Лише баш

$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT

Рішення Perl

$ perl -lne 'END { print $. }' file.txt

і набагато менш читабельні:

$ perl -lne '}{ print $.' file.txt

Рішення Awk

$  awk 'END {print NR}' file.txt

15

Стівен D забув GNU sed:

sed -n '$=' file.txt

Крім того, якщо ви хочете рахувати без виведення імені файлу, і ви використовуєте wc:

wc -l < file.txt

Лише для чорта:

cat -n file.txt | tail -n 1 | cut -f1

2
Або grep -c '', або tr -dc '\n' | wc -c, або nl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'... Чи є щось із цього корисне саме по собі (на відміну від речей, на основі яких можна скласти програму, яка робить більше, ніж підрахунок рядків), крім wc -lчистого (ба) ш?
Жиль

1
@Gilles: Я думаю, що фраза "багато способів" у питанні викликала виклик, до якого ми зі Стівом піднялися.
Денніс Вільямсон

1
@Gilles:sed 's/.*//' file.txt | uniq -c
Денніс Вільямсон

2
@Gilles: О, ти мав на увазі перший . uniq -c -w 0 file.txtі ви можете cut -c -7зберегти лише число. Або, більш POSIXly: uniq -c file.txt | awk '{c+=$1}END{print c}'. Як щодо dc(хоча це не POSIX)? uniq -c file.txt | cut -c -7 | sed '$alax' | dc -e '[pq]sb[+z1=blax]sa' -. bcє POSIX: uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc. Найпростіша відповідь , якщо ви припускаєте , обмежену довжину рядка: uniq -c -f 100000 file.txt.
Денніс Вільямсон

1
@JosipRodin: Котирування додані
Денніс Вільямсон

11

Слово попередження при використанні

wc -l

тому що wc -l функцій, рахуючи \ n, якщо останній рядок у вашому файлі не закінчується в новому рядку, кількість ліній буде вимкнено на 1. (звідси стара конвенція залишає новий рядок в кінці файлу)

Оскільки я ніколи не можу бути впевнений, чи відповідає якомусь файлу умова закінчення останнього рядка новим рядком чи ні, рекомендую використовувати будь-яку з цих альтернативних команд, яка буде включати останній рядок у підрахунок незалежно від нового рядка чи ні.

sed -n $= filename
perl -lne 'END { print $. }' filename
awk 'END {print NR}' filename
grep -c '' filename

приємне резюме. І ласкаво просимо до unix & linux
Себастьян

Хм - справді останній твір?
gena2x

1
Я впевнений, що це залежить від корисної справи кожного; для "останнього фрагмента", як правило, це рядок тексту, який хтось не замінив новим рядком. Шкаф, з яким я найчастіше зустрічаюся, - це файл із єдиним рядком тексту, який не закінчується в новому рядку. wc -l вважав би це "0", коли я б інакше очікував підрахунку "1".
pretzels1337

3

Якщо у вас є лише bash і абсолютно відсутні зовнішні інструменти, ви також можете зробити наступне:

count=0
while read
do
  ((count=$count+1))
done <file.txt
echo $count

Пояснення: цикл зчитує стандартний рядок введення за рядком ( read; оскільки ми все одно нічого не робимо з введеним читанням, для його зберігання не передбачена змінна) і countщоразу збільшує змінну . Через перенаправлення ( <file.txtпісля done) стандартний вхід для циклу відбувається з file.txt.


2

Ви завжди можете використовувати команду grepнаступним чином:

grep -c "^" file.txt

Він буде рахувати всі фактичні рядки file.txt, незалежно від того, в останньому рядку міститься символ НЧ в кінці.

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