conta linhas em um arquivo

58

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
    
por Chris Smith 01.12.2010 / 23:11

6 respostas

91

A maneira padrão é com wc , que recebe argumentos para especificar o que deve contar (bytes, caracteres, palavras etc.); -l é para linhas:

$ wc -l file.txt
1020 file.txt
    
por 01.12.2010 / 23:16
14

Como Michael disse, wc -l é o caminho a percorrer. Mas, caso você tenha inexplicavelmente bash , perl ou awk , mas não wc , aqui estão mais algumas soluções:

Apenas Bash

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

Soluções Perl

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

e muito menos legível:

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

Solução Awk

$  awk 'END {print NR}' file.txt
    
por 02.12.2010 / 00:18
12

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 por isso:

cat -n file.txt | tail -n 1 | cut -f1
    
por 03.12.2010 / 02:40
9

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 de linhas será desativada em 1. (daí a antiga convenção deixando 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, eu 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
    
por 18.09.2014 / 16:56
2

No caso de você ter apenas 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 a linha ( read ; já que não fazemos nada com a entrada de leitura, nenhuma variável é fornecida para armazená-la) e aumenta a variável count a cada vez. Devido ao redirecionamento ( <file.txt após done ), a entrada padrão para o loop é de file.txt .

    
por 06.07.2014 / 22:06
1

Você sempre pode usar o comando grep da seguinte forma:

grep -c "^" file.txt

Ele contará todas as linhas reais de file.txt , mesmo que sua última linha contenha um caractere LF no final.

    
por 05.07.2016 / 09:50