#!/bin/bash
function calcula
{
# Imprimimos el mayor tama�o de fichero
ls -l $1 | awk '
BEGIN {
max = $5; # Inicializamos la variable que nos guardar� el m�ximo con el tama�o del primer archivo
}
{
if ($5 > max){ # Vamos comparando la columna filesizes para cada l�nea (archivo) que compone el ls -l
max = $5;
}
}
END {
print "Tamanio mayor fichero = " max; }'
# Imprimimos ahora el menor tama�o de fichero
ls -l $1 | awk '
NR==2{
min = $5; next # Inicializamos la variable que nos guardar� el m�ximo con el tama�o del primer archivo
# Y saltamos los elementos restantes de la l�nea de entrada puesto que no nos interesan y nos vamos a la siguiente l�nea para procesar la columna filesize
}
{
if ($5 < min){ # Vamos comparando la columa filesizes para cada l�nea (archivo) que compone el ls -l
min = $5;
}
}
END {
print "Tamanio menor fichero = " min; }'
# NOTA: La ejecuci�n del comando ls -l produce como primera l�nea "total xxxxxxx". Por eso, necesitamos, para calcular el m�nimo, empezar a procesar los datos desde la segunda l�nea
# y por eso ejecutamos NR == 2, para que nos empiece en la segunda l�nea, puesto que de no hacerlo, la variable min tomar�a un valor vac�o.
# Y ahora sumamos todos los filesizes y los mostramos
ls -l $1 | awk '{ suma += $5; } END { print "Total bytes ruta : " suma; }'
# Nota: para hacerlo m�s claro, podr�amos expresar el tama�o total en megabytes, dividiendo dos veces
# suma entre 1024 --> ls -l | awk '{ suma += $5; } END { print suma/1024/1024; }'
}
# Fin funcion
# Inicio del programa
i=1
while [ $# -gt 0 ]; do # Mientras existan rutas...
# Imprimimos la ruta
echo
echo La ruta es $1
# Llamamos a la funci�n que nos calcula todo
calcula $1
# Desplazamos los par�metros
i=$(($i+1))
shift
done
echo
My question is how can I improve the efficiency calling awk just one time and not 3.
ls -l $1 | awk '
BEGIN {
max = $5 # Inicializamos la variable que nos guardar� el m�ximo con el tama�o del primer archivo
}
NR==2{
min = $5 next # Inicializamos la variable que nos guardar� el m�ximo con el tama�o del primer archivo
# Y saltamos los elementos restantes de la l�nea de entrada puesto que no nos interesan y nos vamos a la siguiente l�nea para procesar la columna filesize
}
{
if ($5 > max){ # Vamos comparando la columna filesizes para cada l�nea (archivo) que compone el ls -l
max = $5
}
}
{
if ($5 < min && NR > 2){ # Vamos comparando la columa filesizes para cada l�nea (archivo) que compone el ls -l
min = $5
}
}
{ suma += $5 }
END {
print "Tamanio mayor fichero = " max
print "Tamanio menor fichero = " min
print "Total bytes ruta : " suma
}'
# awk --version
awk version 20070501 (FreeBSD)
# ls -l |awk '{
min=min?min:$5 # Set min=min if min exist, if not set min=$5
}
{
if(min>$5) min=$5 # Asign $5 value to min if min is greater that $5
if(max<$5) max=$5 # Asign $5 value to max if $5 is greater that max
suma+= $5 # Addition 5th field value to suma variable
}
END {
printf "min=%d max=%d suma=%d", min,max,suma # Format output for eval
}
'