Я уверен, что есть много способов сделать это: как я могу посчитать количество строк в текстовом файле?
$ <cmd> file.txt
1020 lines
command-line
Крис Смит
источник
источник
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
./regexp/d
удаляет строку, если она совпадаетregexp
, и-e
включает соответствующий (IMNSHO) синтаксис дляregexp
.grep -v '^+ *%' matlab.git.diff | wc -l
?grep
команду, чтобы рассматривать в качестве комментариев такие случаи" + Hello"
(обратите внимание на пробел (ы) перед+
)?grep -v '^ *+' matlab.git.diff | wc -l
(Я предполагаю, что кавычки на самом деле не должны были быть частью строки; я также предполагаю, что обе строки с пробелами перед пробелами и без+
них должны быть комментариями; если в как минимум один пробел является обязательным, либо заменить звезду*
с\+
, или просто добавить еще один пробел перед звездой). Возможно, вместо сопоставления только пробелов, вы захотите сопоставить произвольные пробелы; для этого замените пробел на[[:space:]]
. Обратите внимание, что я также удалил соответствие,%
поскольку это не в вашем примере.Как сказал Майкл,
wc -l
это путь. Но, на всякий случай , если вы необъяснимо естьbash
,perl
или ,awk
но неwc
, вот несколько решений:Bash-только
Perl Solutions
и гораздо менее читаемый:
Awk Solution
источник
Стивен Д забыл GNU
sed
:Кроме того, если вы хотите подсчет без вывода имени файла, и вы используете
wc
:Просто ради этого:
источник
grep -c ''
, илиtr -dc '\n' | wc -c
, илиnl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'
... Является ли что-нибудь из этого полезным само по себе (в отличие от того, на чем можно основываться, чтобы создать программу, которая делает больше, чем просто подсчет строк), кромеwc -l
чистого (ba) sh?sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
и вы можетеcut -c -7
сохранить только номер. Или, более положительно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
.Слово предупреждения при использовании
потому что wc -l функционирует путем подсчета \ n, если последняя строка в вашем файле не заканчивается новой строкой, счетчик строк будет отключен на 1. (следовательно, старое соглашение оставляло символ новой строки в конце вашего файла)
Поскольку я никогда не могу быть уверен в том, что какой-либо из указанных файлов следует условию окончания последней строки новой строкой или нет, я рекомендую использовать любую из этих альтернативных команд, которая будет включать последнюю строку в число независимо от новой строки или нет.
источник
В случае, если у вас есть только bash и абсолютно отсутствуют внешние инструменты, вы также можете сделать следующее:
Объяснение: цикл считывает стандартный ввод построчно (
read
так как мы все равно ничего не делаем с вводом чтения, переменная для его сохранения не предоставляется) и увеличивает переменнуюcount
каждый раз. Из-за перенаправления (<file.txt
послеdone
), стандартный вход для цикла отfile.txt
.источник
Вы всегда можете использовать команду
grep
следующим образом:Он будет считать все фактические строки
file.txt
, независимо от того, содержит ли последняя строка символ LF в конце.источник