script - obtener solo el número entero de wc en bash
scripts linux ejercicios resueltos (15)
"Básicamente, quiero escribir los números de línea y los recuentos de palabras en la pantalla después del nombre del archivo".
answer=(`wc $f`)
echo -e"${answer[3]}
lines: ${answer[0]}
words: ${answer[1]}
bytes: ${answer[2]}"
Salidas: líneas myfile.txt: 10 palabras: 20 bytes: 120
¿Hay alguna forma de obtener el entero que devuelve wc en bash?
Básicamente, quiero escribir los números de línea y los recuentos de palabras en la pantalla después del nombre del archivo.
output: filename linecount wordcount
es lo que tengo hasta ahora:
files=`ls`
for f in $files;
do
if [ ! -d $f ] #only print out information about files !directories
then
# some way of getting the wc integers into shell variables and then printing them
echo "$f $lines $ words"
fi
done
¿Qué tal con sed
?
wc -l /path/to/file.ext | sed ''s/ */([0-9]* /).*//1/''
A veces, los resultados de wc en diferentes formatos en diferentes plataformas. Por ejemplo:
En OS X:
$ echo aa | wc -l
1
En Centos:
$ echo aa | wc -l
1
Entonces, usar solo corte no puede recuperar el número. En su lugar, intente tr para eliminar caracteres espaciales:
$ echo aa | wc -l | tr -d '' ''
La respuesta más simple de todas:
wc < filename
Las respuestas aceptadas / populares no funcionan en OSX.
Cualquiera de los siguientes debe ser portable en bsd y linux.
wc -l < $f | tr -d '' ''
O
wc -l $f | tr -s '' '' | cut -d '' '' -f 2
O
wc -l $f | awk ''{print $1}''
Otra forma, similar a lo que @BananaNeil publicó:
$ cat myfile.txt | wc -l
Prueba esto para obtener un resultado numérico:
nlines = $ (wc -l <$ myfile)
Prueba esto:
wc `ls` | awk ''{ LINE += $1; WC += $2 } END { print "lines: " LINE " words: " WC }''
Crea un conteo de líneas y recuentos de palabras (LINE y WC) y los aumenta con los valores extraídos de wc (utilizando $ 1 para el valor de la primera columna y $ 2 para el segundo) y finalmente imprime los resultados.
Puede utilizar el comando de cut
para obtener solo la primera palabra de la salida de wc
(que es el recuento de líneas o palabras):
lines=`wc -l $f | cut -f1 -d'' ''`
words=`wc -w $f | cut -f1 -d'' ''`
Sólo:
wc -l < file_name
hará el trabajo
Si el archivo es pequeño, puede permitirse llamar al wc
dos veces, y usar algo como lo siguiente, lo que evita que ingrese en un proceso adicional:
lines=$((`wc -l $f`))
words=$((`wc -w $f`))
El $((...))
es la Expansión Aritmética de bash. Elimina cualquier espacio en blanco de la salida de wc
en este caso.
Esta solución tiene más sentido si necesita el conteo de líneas o la palabra.
Si redirige el nombre del archivo a wc
, omite el nombre del archivo en la salida.
Intento:
read lines words characters <<< $(wc < filename)
o
read lines words characters <<EOF
$(wc < filename)
EOF
En lugar de usar for
para iterar sobre la salida de ls
, haga esto:
for f in *
que funcionará si hay nombres de archivos que incluyen espacios.
Si no puede usar globbing, debe canalizar en un ciclo while read
:
find ... | while read -r f
o use la sustitución del proceso
while read -r f
do
something
done < <(find ...)
files=`ls`
echo "$files" | wc -l | perl -pe "s#^/s+##"
typeset -i a=$(wc -l fileName.dat | xargs echo | cut -d'' '' -f1)
wc $file | awk {''print "$4" "$2" "$1"''}
Ajústelo según sea necesario para su diseño.
También es mejor utilizar una lógica positiva ("es un archivo") que una negativa ("no es un directorio")
[ -f $file ] && wc $file | awk {''print "$4" "$2" "$1"''}