¿Hay alguna forma de obtener el entero que devuelve wc en bash?
Básicamente, quiero escribir los números de línea y el recuento de palabras en la pantalla después del nombre del archivo.
output: filename linecount wordcount
Esto 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
cut
trabajar en la salida completa dewc $f
porque la cantidad de espacios entre campos varía.La respuesta más simple de todos:
fuente
wc -c < file name
, le dará solo el número entero de bytes y nada más.Sólo:
hará el trabajo. Pero esta salida incluye espacios en blanco con prefijo ya que
wc
alinea a la derecha el número.fuente
wc -l < foo.txt | xargs
ref - stackoverflow.com/a/12973694/149428lines=`wc -l < $f`
da como resultado una "línea" variable cuyo valor no tiene espacios iniciales.find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l
funciona bien pero imprime todos los archivos. Si lo usofind . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l <
, obtengo un error.parse error near '\n'
Ajuste según sea necesario para su diseño.
También es más agradable usar lógica positiva ("es un archivo") sobre negativa ("no es un directorio")
fuente
wc $file | awk '{print $4" "$2" "$1}'
- apóstrofos fuera de{}
.A veces, wc genera salidas en diferentes formatos en diferentes plataformas. Por ejemplo:
En OS X:
En Centos:
Por lo tanto, es posible que usar solo cortar no recupere el número. En su lugar, intente tr para eliminar los espacios:
fuente
Las respuestas aceptadas / populares no funcionan en OSX.
Cualquiera de los siguientes debe ser portátil en bsd y linux.
O
O
fuente
Si redirige el nombre del archivo
wc
, omite el nombre del archivo en la salida.Intento:
o
En lugar de usar
for
para iterar sobre la salida dels
, haga esto:que funcionará si hay nombres de archivo que incluyen espacios.
Si no puede usar globbing, debe canalizar en un
while read
bucle:o utilizar sustitución de procesos
fuente
read lines words characters filename <<< $(wc "$f")
Ah, y si solía endurecerse * contra los espacios, también desea comillas dobles la var cuando la use.$f
en este caso), no es necesario. Además, el OP preguntó cómo obtener solo el número entero. Tiene razón al citar una variable, pero no mostré el uso de la variable, así que omití mencionar ese punto. Elfor f in *
formulario casi siempre debe usarse en lugar de usar la salida dels
, como sabe.ls
punto. Eso te dará un premio. partmaps.org/era/unix/award.html#lsread lines words characters _ <<< $(wc "$f")
$_
es solo una variable diferente.Si el archivo es pequeño, puede darse el lujo de llamar
wc
dos veces y usar algo como lo siguiente, que evita la canalización hacia un proceso adicional:El
$((...))
es la expansión aritmética de bash. Elimina cualquier espacio en blanco de la salida dewc
en este caso.Esta solución tiene más sentido si necesita ya sea la lineatura o el recuento de palabras.
fuente
¿Qué tal con
sed
?fuente
fuente
Pruebe esto para obtener un resultado numérico:
nlines = $ (wc -l <$ myfile)
fuente
Prueba esto:
Crea un recuento de líneas y un recuento de palabras (LINE y WC), y los incrementa con los valores extraídos de wc (usando $ 1 para el valor de la primera columna y $ 2 para la segunda) y finalmente imprime los resultados.
fuente
Salidas: myfile.txt líneas: 10 palabras: 20 bytes: 120
fuente
fuente
perl
todos modos, también podría hacer el recuento de palabras en Perl. Un enfoque más económico sería canalizar atr -d '[:space:]'