¿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).



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.


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

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    

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

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}.


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.