Tengo las siguientes tres construcciones 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 una salida idéntica 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 cual no quiero). ¿Por qué fallan estos scriplets y cómo debo generar una limpieza?
121711 lines
?
Respuestas:
Un ejemplo usando sus propios datos
Puede evitar tener su nombre de archivo incrustado en la variable NUMOFLINES usando la redirección desde JAVA_TAGS_FILE , en lugar de pasar el nombre de archivo como un argumento a wc . Por ejemplo:
NUMOFLINES=$(wc -l < "$JAVA_TAGS_FILE")
Explicación: Utilice canalizaciones o redireccionamiento para evitar nombres de archivo en la salida
La utilidad wc no imprimirá el nombre del archivo en su salida si la entrada se toma de una tubería o un operador de redirección. Considere 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 wc imprimirá 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 saber cuándo se mostrará.
fuente
wc
no puede obtener el nombre del archivo si no le da uno.wc -l < "$JAVA_TAGS_FILE"
fuente
wc
's stdin como se muestra en la respuesta. Así quecat "$JAVA_TAGS_FILE" | wc -l
o, equivalentemente,wc -l < "$JAVA_TAGS_FILE"
. De esta manera,wc
solo obtiene datos sin procesar, no el nombre del archivo.También puedes usar awk:
awk 'END {print NR,"lines"}' filename
O
awk 'END {print NR}' filename
fuente
(aplicar en Mac y probablemente en otros Unix)
En realidad, existe un problema con el enfoque wc: no cuenta la última línea si no termina con el símbolo de fin de línea.
Usa esto en su lugar
o incluso mejor (gracias gniourf_gniourf):
nblines=$(grep -c '' file.txt)
Nota: El enfoque awk de chilicuil también funciona.
fuente
nblines=$(grep -c '' file)
lugar (que es la forma canónica de contar líneas incompletas en este caso). Sin embargo, tenga en cuenta que, según POSIX, está contando las líneas incompletas (y no las líneas ). De hecho, se trata de un archivo binario y no de un archivo de texto .nblines=$(($(cat "file.txt" | wc -l) + 1))
Es muy simple:
NUMOFLINES=$(cat $JAVA_TAGS_FILE | wc -l )
o
NUMOFLINES=$(wc -l $JAVA_TAGS_FILE | awk '{print $1}')
fuente
cat
, tendría el segundo ejemplo porquewc -l
devuelve 2 columnas cuando se usa solo con un archivo.Normalmente uso la función 'retroceso' de bash
export NUM_LINES=`wc -l filename`
Tenga en cuenta que la 'marca' es la 'marca inversa', por ejemplo, 'no la comilla simple normal
fuente