¿Cómo cuento las líneas de texto?

14

¿Cómo cuento cuántas líneas hay en el archivo de texto? p.ej :

command file.txt

Tenga en cuenta que solo quiero contar las líneas no vacías (líneas sin contar espacios en blanco y pestañas).

usuario93097373
fuente
44
La pregunta no está bien definida: ¿una línea con solo espacios en blanco (espacios y TAB) se considera vacía?
Rmano
Votantes cercanos : pregunta editada después de la aclaración de @ Rmano según su comentario de OP. Así que por favor no vote para cerrar como No está claro
α --sнιη
2
@KasiyA aún no está claro. No entiendo si el OP quiere contar una línea con solo espacios en blanco (espacios, tabuladores \r) u omitirlos. El actual responde todas las líneas de recuento con espacios y solo omite las vacías.
terdon
@terdon OP NO QUIERO contar las líneas en blanco (incluidas las líneas vacías ( \ro \n), las líneas con solo pestañas y las líneas con solo espacios) y quiero omitirlas como creo y respondí de acuerdo con lo que he entendido.
αғsнιη

Respuestas:

11

Las respuestas anteriores son correctas pero ligeramente diferentes, puede usar el greppara un código más fácil comogrep -vc '^$' file.txt

Por ejemplo (A): archivo.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 ejemplo (B): archivo.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 el resultado es 4! cuando queremos esperar solo dos. pero esto cuenta las pestañas entre el contenido y el comentario también.

Observe que los recuentos de 0 y los recuentos de 1 son diferentes del grep al sed, ya que recuerdo para obtener más detalles, busque grep o sed.

amrx
fuente
1
Ambos de sus ejemplos contará las líneas vacías, pero OP solicitado un comando para contar todo pero las líneas vacías
kos
2
De hecho, estoy equivocado, la sedopción es correcta, pero la grepotra no
kos
Siendo solo parcialmente correcto, rechacé la respuesta, envíeme un comentario cuando la haya arreglado para que pueda eliminar mi voto negativo
kos
1
@kos Estoy bastante seguro, ¿te das cuenta de lo vaga que es la pregunta?
amrx
2
@kos, tenías razón en primer lugar, gracias. No he dormido en más de 36 horas, ¡creo que es hora de dormir!
amrx
12

Prueba sed:

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

Si tiene líneas que solo contienen espacios o pestañas y también desea ignorarlas desde el conteo:

sed '/^[[:blank:]]*$/d' file.txt | wc -l
heemayl
fuente
3
Solía ^\s*$tener en cuenta también las líneas que solo contienen tabulaciones o espacios.
Sylvain Pineau
@SylvainPineau: Agregado ..
heemayl
1
Estoy de acuerdo en que no estaba claro en la pregunta de OP, pero el texto con espacios / tabulación puede alterar el resultado esperado, +1.
Sylvain Pineau
3

Utilizando grep:

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

Puedes usar:

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

Si necesita un comando para eso, simplemente pegue las siguientes líneas en su .bashrcy reinicie su sesión de shell o abra una nueva terminal:

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

Ejemplo:

count_lines file.txt
42
Sylvain Pineau
fuente
2

Con :

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

Explicación:

El NFindica el número total de campos, y por lo tanto esta imprime sólo las líneas no están en blanco , ya que en líneas no están en blanco NFes mayor que 0y se evalúa como TRUE. Por lo tanto, incremente el indicador de conteo cuando awk encuentre líneas no en blanco e imprima el último valor del indicador de conteo al final END{print count}.

αғsнιη
fuente
1

Editar : solo puede agregar la copción a en greplugar de canalizar todo a wc, vea la respuesta de @ muru para una versión más compacta


Con grep:

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

Solución Perl

Perl puede hacer eso. En general, las líneas de conteo funcionan así:

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

Si queremos excluir todas las líneas vacías, haremos algo como esto:

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

Digamos que tenemos un archivo de entrada como este

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

Hay 5 líneas en total, 2 líneas vacías. El comando que tenemos generaría:

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

Mejora de múltiples archivos

Esto funciona bien para un solo archivo. Si queremos que funcione en varios archivos, podemos hacer algo como esto:

$ 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
fuente