Como conto linhas de texto?

14

Como posso contar quantas linhas existem no arquivo de texto. por exemplo :

command file.txt

Observe que quero contar apenas as linhas não vazias (linhas sem contar espaços em branco e tabulações) ?.

user93097373
fonte
4
A questão não está bem definida: uma linha com apenas espaços em branco (espaços e TAB) é considerada vazia?
Rmano 19/03/2015
Eleitores próximos : pergunta editada após o esclarecimento de @ Rmano, de acordo com o comentário do OP. Portanto, por favor, não vote para fechar como Não está claro
#
2
@KasiyA ainda não está claro. Não entendo se o OP deseja contar uma linha apenas com espaços em branco (espaços, tabulações \r) ou ignorá-los. O atual responde a todas as linhas de contagem com espaços e pula apenas as vazias.
terdon 19/03/15
@terdon OP NÃO deseja contar as linhas em branco (incluindo linhas vazias ( \rou \n), linhas com apenas guias e linhas com apenas espaços) e deseja ignorá-las como penso e respondi de acordo com O que eu entendi.
αғsнιη

Respostas:

11

A resposta acima está correta, mas um pouco diferente, você pode usar o greppara para um código mais fácil, comogrep -vc '^$' file.txt

Por exemplo (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

Por exemplo (B): arquivo.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

Observe que o resultado é 4! quando queremos esperar apenas dois. mas isso também conta as guias entre o conteúdo e o comentário.

Observe que a contagem de 0 e a contagem de 1 são diferentes do grep para o sed, pois eu lembro para mais detalhes, procure por grep ou sed.

amrx
fonte
1
Ambos os exemplos contarão as linhas vazias, mas o OP solicitou um comando para contar tudo, exceto as linhas vazias
kos
2
Na verdade eu estou errado, a sedopção é realmente correto, mas a greppessoa não é
kos
Sendo apenas parcialmente correta I downvoted a resposta, mande-me um comentário quando você ter corrigido isso para que eu possa retirar o meu downvote
kos
1
@ kos tenho certeza, você percebe como é vaga a pergunta?
amrx
2
@ kos, você estava certo em primeiro lugar, obrigado. Não durmo há mais de 36 horas, acho que é hora de dormir!
amrx
12

Tente sed:

sed '/^$/d' file.txt | wc -l

Se você possui alguma linha contendo apenas espaços ou tabulações e deseja ignorá-las também da contagem:

sed '/^[[:blank:]]*$/d' file.txt | wc -l
heemail
fonte
3
Eu usaria ^\s*$também para levar em conta linhas contendo apenas tabulação ou espaços.
19415 Sylvain Pineau
@SylvainPineau: Adicionado ..
heemayl
1
Concordo que a questão do OP não ficou clara, mas o texto com espaços / tabulação pode alterar o resultado esperado, +1.
19415 Sylvain Pineau
3

Usando grep:

grep -vc '^$' file  # or
grep -vc '^\s*$' file    
muru
fonte
3

Você pode usar:

grep -cve '^\s*$' file.txt

Se você precisar de um comando para isso, basta colar as seguintes linhas na sua .bashrce reinicie a sessão do shell ou abra um novo terminal:

count_lines()
{
    grep -cve '^\s*$' $1
}

Exemplo:

count_lines file.txt
42
Sylvain Pineau
fonte
2

Com :

awk 'NF{++count} END{print count}' file

Explicação:

O NFindica o número total de campos e, portanto, isso imprime apenas linhas não em branco , pois nas linhas não em branco NFé maior que 0e avalia como verdadeiro. Portanto, aumente o sinalizador de contagem quando o awk encontrou linhas não em branco e imprima o valor mais recente do sinalizador de contagem no final até END{print count}.

αғsнιη
fonte
1

Edit : você pode simplesmente adicionar a copção ao grepinvés de canalizar tudo wc, veja a resposta do @ muru para uma versão mais compacta


Com grep:

grep -v '^$' file.txt | wc -l
kos
fonte
0

Solução Perl

Perl pode fazer isso. Em geral, as linhas de contagem funcionam da seguinte maneira:

$ perl -ne 'END{print $.}' input.txt                                                                                     

Se quisermos excluir todas as linhas vazias, faremos algo assim:

$ perl -ne '$c+=1 if not /^$|^\s+$/;END{print $c}' input.txt                                                             

Digamos que tenhamos um arquivo de entrada como este

$ cat -n input.txt
     1  Cat; Dog; Squirrel
     2  ORGANISM Animalus terrus
     3  
     4  Sequence: ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT
     5  

Há 5 linhas no total, 2 linhas vazias. O comando que temos apresentaria:

$ perl -ne '$c+=1 if not /^$|^\s+$/;END{print $c}' input.txt                                                             
3

Melhoria em vários arquivos

Isso funciona bem para um único arquivo. Se quisermos que ele funcione em vários arquivos, podemos fazer algo assim:

$ 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
Sergiy Kolodyazhnyy
fonte