¿Cómo hacer que "wc -l" imprima solo el número de líneas sin nombre de archivo?

155
wc -l file.txt

Produce el número de líneas y el nombre del archivo.

Solo necesito el número en sí (no el nombre del archivo).

puedo hacer esto

 wc -l file.txt | awk '{print $1}'

Pero tal vez hay una mejor manera?

PoGibas
fuente
13
wc -l < file.txthace el trabajo de manera precisa y concisa.
Jonathan Leffler
2
Posible duplicado de obtener solo el entero de wc en bash
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
3
Esta es una pregunta que he buscado dos veces ahora. Este comportamiento de wc es poco intuitivo y anti-paradigmático para la brevedad habitual. Esa brevedad está ahí por una razón, porque exactamente no desea evitar todo tipo de redundancia esponjosa. Después de todo, el nombre del archivo, ¿no? Lo que quiero es el recuento de líneas.
Peter - Restablece a Mónica el

Respuestas:

217

Intenta de esta manera:

wc -l < file.txt
Norman Ramsey
fuente
55
En AIX, ksh, esto siempre tendrá un espacio antes del número. Tenemos que usar | awk '{print $ 1}' o un corte, para recortar los espacios. Otra forma de recortar sería encerrar con un eco.
rao
@rao es correcto, esto agregará un espacio antes del número. Mi solución resuelve esto y es más simple que awk o cut.
Desi Cochrane
@rao No hay espacio con bash. ¿De dónde viene el espacio en ksh? wc -lno debería emitir uno, y ¿por qué ksh antepone la salida estándar de un programa con un espacio?
Peter - Restablece a Monica el
Si bien esta es la solución correcta (y es bastante fácil que nunca se modifique), es probable que sea más lenta y poco intuitiva. Por un lado, esperaría algo así 4711 [stdin]como la salida.
Peter - Restablece a Monica el
Considere también el emparejamiento con printf "%'d", que cuida el espacio e imprime números grandes muy bien.
Leo
21
cat file.txt | wc -l

De acuerdo con la página del manual (para la versión BSD, no tengo una versión GNU para verificar):

Si no se especifican archivos, se utiliza la entrada estándar y no se muestra el nombre del archivo. La solicitud aceptará la entrada hasta recibir EOF o [^ D] en la mayoría de los entornos.

pjmorse
fuente
3
No me gusta el gato: la concatenación consume mucho tiempo.
PoGibas
9
wc -l < file.txttiene el mismo efecto
pjmorse el
@usuario: Pruébelo. Con mucho, la parte más lenta será leer el archivo del disco.
sarnold
11
@ user1286528 luego se usa wc -l < file.txtpara evitar el uso inútil del gato. Aunque estás absolutamente loco si crees que eso está consumiendo un tiempo notable.
hobbs
12

Para hacer esto sin el espacio inicial, ¿por qué no?

wc -l < file.txt | bc
Desi Cochrane
fuente
Recibo errores de sintaxis con esto (Ubuntu 14.04). Creo que hay un problema con el nombre del archivo.
MERose
En un RHEL 6.7 genera errores: $ wc -l file.csv | bc (standard_in) 1: error de sintaxis (standard_in) 1: carácter ilegal: N (standard_in) 1: error de sintaxis (standard_in) 1: error de sintaxis
Rodrigo Hjort
3
También recibo un error de análisis, pero puede combinar esto con la otra respuesta wc -l < file.txtpara solucionar el error de análisis y eliminar el espacio:wc -l < file.txt | bc
jangosteve
11

Qué tal si

wc -l file.txt | cut -d' ' -f1

es decir, canalice la salida de wcen cut(donde los delimitadores son espacios y seleccione solo el primer campo)

Neil Albert
fuente
44
Esto no es mejor de lo que el wc -l file.txt | awk '{print $1}'OP intentó.
doubleDown
1
Más rápido que el wc -l < file.txtmétodo. Pero debe usarse | cut -d' ' -f2en BSD, siempre que el wccomando devuelva un espacio inicial, por ejemplo: "34068289 file.txt", en lugar de "34068289 file.txt".
Sopalajo de Arrierez
@doubleDown, usar awk es como usar una máquina CNC para cortar una tabla en lugar de una sierra. Use una sierra para aserrar.
Peter - Restablece a Mónica el
5

Comparación de técnicas

Tuve un problema similar al intentar obtener un recuento de caracteres sin el espacio en blanco principal proporcionado por wc, lo que me llevó a esta página. Después de probar las respuestas aquí, los siguientes son los resultados de mis pruebas personales en Mac (BSD Bash). De nuevo, esto es para contar personajes; para el recuento de líneas que harías wc -l. echo -nomite el salto de línea final.

FOO="bar"
echo -n "$FOO" | wc -c                          # "       3"    (x)
echo -n "$FOO" | wc -c | bc                     # "3"           (√)
echo -n "$FOO" | wc -c | tr -d ' '              # "3"           (√)
echo -n "$FOO" | wc -c | awk '{print $1}'       # "3"           (√)
echo -n "$FOO" | wc -c | cut -d ' ' -f1         # "" for -f < 8 (x)
echo -n "$FOO" | wc -c | cut -d ' ' -f8         # "3"           (√)
echo -n "$FOO" | wc -c | perl -pe 's/^\s+//'    # "3"           (√)
echo -n "$FOO" | wc -c | grep -ch '^'           # "1"           (x)
echo $( printf '%s' "$FOO" | wc -c )            # "3"           (√)

No confiaría en el cut -f*método en general, ya que requiere que sepas el número exacto de espacios iniciales que puede tener cualquier salida dada. Y el grepque funciona para contar líneas, pero no caracteres.

bces el más conciso awky perlparece un poco exagerado, pero todos deberían ser lo suficientemente rápidos y portátiles.

También tenga en cuenta que algunos de estos también se pueden adaptar para recortar el espacio en blanco circundante de las cadenas generales (junto con echo `echo $FOO`otro truco ordenado).

Beejor
fuente
1
echo $(printf '%s' "$FOO" | wc -c)Es una de las raras ocasiones en que echocon un comando subshitution no es inútil.
tripleee
@tripleee Whoa ... basado en su código, ¡ echo `echo $FOO`;también actúa como un comando String.trim () en una variable! Eso es increíblemente útil. También agregaré tu línea a mi respuesta.
Beejor
Quizás para el contexto, vea también Cuándo ajustar las comillas alrededor de una variable de shell
tripleee
... así como por qué esprintf mejor que echo?
tripleee
4

Qué tal si

grep -ch "^" file.txt
MeIsMich
fuente
3
Agradable. Uso muy original / creativo de greppero al comprobar esto resulta (como era de esperar) que sea 2x a 6x más lento que el wcmétodo más simple / directo en mis pruebas.
arielf
3

Obviamente, hay muchas soluciones para esto. Sin embargo, aquí hay otro:

wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"

Esto solo genera el número de líneas, pero el carácter de nueva línea final ( \n) está presente, si tampoco lo desea, reemplace [:blank:]con [:space:].

Bouchaala Reda
fuente
Esto tiene el problema cuando el nombre del archivo tiene un número. Por ejemplo, para el archivo test9con 1 línea, la salida será 19.
Raphael Ahrens
1

La mejor manera sería, en primer lugar, encontrar todos los archivos en el directorio y luego usar AWK NR (variable de número de registros)

a continuación se muestra el comando:

find <directory path>  -type f | awk  'END{print NR}'

ejemplo: - find /tmp/ -type f | awk 'END{print NR}'

usuario128364
fuente
0

Esto funciona para mí usando lo normal wc -ly sedpara quitar cualquier carácter que no sea un número.

wc -l big_file.log | sed -E "s/([a-z\-\_\.]|[[:space:]]*)//g"

# 9249133
joseluisq
fuente