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?
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?
Respuestas:
Intenta de esta manera:
wc -l < file.txt
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.
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.
wc -l < file.txt
tiene el mismo efecto
wc -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?
wc -l < file.txt | bc
wc -l < file.txt
para solucionar el error de análisis y eliminar el espacio:wc -l < file.txt | bc
Qué tal si
wc -l file.txt | cut -d' ' -f1
es decir, canalice la salida de wc
en cut
(donde los delimitadores son espacios y seleccione solo el primer campo)
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 el wc
comando devuelva un espacio inicial, por ejemplo: "34068289 file.txt", en lugar de "34068289 file.txt".
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 -n
omite 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 grep
que funciona para contar líneas, pero no caracteres.
bc
es el más conciso awk
y perl
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).
echo $(printf '%s' "$FOO" | wc -c)
Es una de las raras ocasiones en que echo
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 que echo
?
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:]
.
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:
find <directory path> -type f | awk 'END{print NR}'
ejemplo: - find /tmp/ -type f | awk 'END{print NR}'
wc -l < file.txt
hace el trabajo de manera precisa y concisa.