Tenho certeza de que há muitas maneiras de fazer isso: como posso contar o número de linhas em um arquivo de texto?
$ <cmd> file.txt
1020 lines
Tenho certeza de que há muitas maneiras de fazer isso: como posso contar o número de linhas em um arquivo de texto?
$ <cmd> file.txt
1020 lines
Respostas:
A maneira padrão é with wc
, que utiliza argumentos para especificar o que deve ser contado (bytes, caracteres, palavras, etc.); -l
é para linhas:
$ wc -l file.txt
1020 file.txt
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
. /regexp/d
exclui uma linha se corresponder regexp
e -e
ativa uma sintaxe adequada (IMNSHO) para regexp
.
grep -v '^+ *%' matlab.git.diff | wc -l
?
grep
comando para considerar casos de comentários como " + Hello"
(observe o (s) espaço (s) antes do +
)?
grep -v '^ *+' matlab.git.diff | wc -l
(eu suponho que os sinais de cotação não foram feitos para fazer parte da linha; eu também assumo que ambas as linhas com e sem espaços à frente do +
texto sejam comentários; se em menos, um espaço é obrigatório, substituir a estrela *
com \+
, ou apenas adicionar um outro espaço na frente da estrela). Provavelmente, em vez de corresponder apenas a espaços, convém corresponder a espaços em branco arbitrários; para isso substitua o espaço com [[:space:]]
. Observe que também removi a correspondência de, %
pois não está no seu exemplo.
Como Michael disse, wc -l
é o caminho a percorrer. Mas, apenas no caso de você inexplicavelmente têm bash
, perl
ou awk
, mas não wc
, aqui estão mais algumas soluções:
$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT
$ perl -lne 'END { print $. }' file.txt
e o muito menos legível:
$ perl -lne '}{ print $.' file.txt
$ awk 'END {print NR}' file.txt
Steven D esqueceu o GNU sed
:
sed -n '$=' file.txt
Além disso, se você quiser a contagem sem gerar o nome do arquivo e estiver usando wc
:
wc -l < file.txt
Apenas para o inferno:
cat -n file.txt | tail -n 1 | cut -f1
grep -c ''
, ou tr -dc '\n' | wc -c
, ou nl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'
... Alguma dessas opções é útil por si só (em oposição às coisas a serem construídas para criar um programa que faz mais do que contar linhas), além de wc -l
(puro) (ba) sh?
sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
e você pode cut -c -7
manter apenas o número. Ou, mais POSIXly: uniq -c file.txt | awk '{c+=$1}END{print c}'
. Que tal dc
(mesmo que não seja 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
. A resposta fácil se você assumir um comprimento de linha limitada: uniq -c -f 100000 file.txt
.
Palavra de aviso ao usar
wc -l
porque wc -l funciona contando \ n, se a última linha do seu arquivo não terminar em uma nova linha efetivamente, a contagem da linha será desativada em 1. (daí a convenção antiga que deixa a nova linha no final do seu arquivo)
Como nunca posso ter certeza se algum arquivo segue a convenção de terminar a última linha com uma nova linha ou não, recomendo usar qualquer um desses comandos alternativos que incluirão a última linha na contagem, independentemente da nova linha ou não.
sed -n $= filename
perl -lne 'END { print $. }' filename
awk 'END {print NR}' filename
grep -c '' filename
Caso você tenha apenas o bash e absolutamente nenhuma ferramenta externa disponível, você também pode fazer o seguinte:
count=0
while read
do
((count=$count+1))
done <file.txt
echo $count
Explicação: o loop lê a entrada padrão linha por linha ( read
; como não fazemos nada com a entrada de leitura de qualquer maneira, nenhuma variável é fornecida para armazená-la) e aumenta a variável a count
cada vez. Devido ao redirecionamento ( <file.txt
depois done
), a entrada padrão para o loop é de file.txt
.