script - bash echo número de líneas de archivo dadas en una variable bash sin el nombre del archivo
scripts linux ejercicios resueltos (6)
Tengo los siguientes tres constructos en un script bash:
NUMOFLINES=$(wc -l $JAVA_TAGS_FILE)
echo $NUMOFLINES" lines"
echo $(wc -l $JAVA_TAGS_FILE)" lines"
echo "$(wc -l $JAVA_TAGS_FILE) lines"
Y ambos producen resultados idénticos cuando se ejecuta el script:
121711 /home/slash/.java_base.tag lines
121711 /home/slash/.java_base.tag lines
121711 /home/slash/.java_base.tag lines
Es decir, el nombre del archivo también se repite (lo que no quiero). ¿Por qué estos scriplets fallan y cómo debería generar un resultado limpio?
121711 lines
?
Un ejemplo usando tus propios datos
Puede evitar tener su nombre de archivo incrustado en la variable NUMOFLINES utilizando la redirección de JAVA_TAGS_FILE , en lugar de pasar el nombre de archivo como argumento a wc . Por ejemplo:
NUMOFLINES=$(wc -l < "$JAVA_TAGS_FILE")
Explicación: Use Pipes o Redirection para evitar nombres de archivo en Output
La utilidad wc no imprimirá el nombre del archivo en su salida si la entrada se toma de un operador de canalización o redirección. Considera estos varios ejemplos:
# wc shows filename when the file is an argument
$ wc -l /etc/passwd
41 /etc/passwd
# filename is ignored when piped in on standard input
$ cat /etc/passwd | wc -l
41
# unusual redirection, but wc still ignores the filename
$ < /etc/passwd wc -l
41
# typical redirection, taking standard input from a file
$ wc -l < /etc/passwd
41
Como puede ver, la única vez que imprimiremos el nombre del archivo es cuando se pasa como un argumento, en lugar de como datos en la entrada estándar. En algunos casos, es posible que desee que se imprima el nombre del archivo, por lo que es útil comprender cuándo se mostrará.
(aplicar en Mac, y probablemente otros Unixes)
En realidad, hay un problema con el enfoque de wc: no cuenta la última línea si no termina con el símbolo de fin de línea.
Use esto en su lugar
nbLines=$(cat -n file.txt | tail -n 1 | cut -f1 | xargs)
o incluso mejor (gracias gniourf_gniourf):
nblines=$(grep -c '''' file.txt)
Nota: El enfoque awk de chilicuil también funciona.
Es muy simple:
NUMOFLINES=$(cat $JAVA_TAGS_FILE | wc -l )
o
NUMOFLINES=$(wc -l $JAVA_TAGS_FILE | awk ''{print $1}'')
Normalmente uso la función ''back tick'' de bash
export NUM_LINES=`wc -l filename`
Tenga en cuenta que la "marca" es la "marca de retroceso", por ejemplo, "no la comilla simple normal"
También puedes usar awk:
awk ''END {print NR,"lines"}'' filename
O
awk ''END {print NR}'' filename
wc
no puede obtener el nombre de archivo si no le das uno.
wc -l < "$JAVA_TAGS_FILE"