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, sé el nombre del archivo, ¿no? Lo que quiero es el recuento de líneas.
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.
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?
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)
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.
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).
@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.
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:
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:].
wc -l < file.txt
hace el trabajo de manera precisa y concisa.Respuestas:
Intenta de esta manera:
fuente
wc -l
no debería emitir uno, y ¿por qué ksh antepone la salida estándar de un programa con un espacio?4711 [stdin]
como la salida.printf "%'d"
, que cuida el espacio e imprime números grandes muy bien.De acuerdo con la página del manual (para la versión BSD, no tengo una versión GNU para verificar):
fuente
wc -l < file.txt
tiene el mismo efectowc -l < file.txt
para evitar el uso inútil del gato. Aunque estás absolutamente loco si crees que eso está consumiendo un tiempo notable.Para hacer esto sin el espacio inicial, ¿por qué no?
fuente
wc -l < file.txt
para solucionar el error de análisis y eliminar el espacio:wc -l < file.txt | bc
Qué tal si
es decir, canalice la salida de
wc
encut
(donde los delimitadores son espacios y seleccione solo el primer campo)fuente
wc -l file.txt | awk '{print $1}'
OP intentó.wc -l < file.txt
método. Pero debe usarse| cut -d' ' -f2
en BSD, siempre que elwc
comando devuelva un espacio inicial, por ejemplo: "34068289 file.txt", en lugar de "34068289 file.txt".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íaswc -l
.echo -n
omite el salto de línea final.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 elgrep
que funciona para contar líneas, pero no caracteres.bc
es el más concisoawk
yperl
parece 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).fuente
echo $(printf '%s' "$FOO" | wc -c)
Es una de las raras ocasiones en queecho
con un comando subshitution no es inútil.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.printf
mejor queecho
?Qué tal si
fuente
grep
pero al comprobar esto resulta (como era de esperar) que sea 2x a 6x más lento que elwc
método más simple / directo en mis pruebas.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:]
.fuente
test9
con 1 línea, la salida será 19.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:
ejemplo: -
find /tmp/ -type f | awk 'END{print NR}'
fuente
Esto funciona para mí usando lo normal
wc -l
ysed
para quitar cualquier carácter que no sea un número.fuente