Improve program efficiency (awk)

Hi !! I've finished an awk exercise. Here it is:

#!/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.

Thanks !!

No hablo Espanol pero you can try this:

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 
}'

Regards

something like:

#  ls -l | awk 'BEGIN{max=0;min=99999}NR>1{sum+=$5;if (min>$5){min=$5};if ($5>max){max=$5}}END{print sum;print max;print min}'
36420041
15763946
0

Should be a step inn the right direction..

#!/bin/bash
eval $(ls -l $1 | awk 'NR>1{min=min?min:$5}{if(min >$5)min=$5}{if(max<$5)max=$5;suma+=$5}END{printf "min=%d max=%d suma=%d", min,max,suma}')

echo $min
echo $max
echo $suma 

You can work from here.

---------- Post updated at 10:53 AM ---------- Previous update was at 10:13 AM ----------

What if all files size on directory are greater that 99999 byte/98 kilobyte :rolleyes:

Danmero, i've tried ur code, but files with 0 size aren't caughted like min, just the file with the min size > 0.

PD: can u explain me a bit ur code? dont understand a lot "min=min?min:$5" and why u compare max without initialize it hehe

Works for me.

# ls -l
total 10
-rw-r--r--  1 root  wheel   135 Jul 27 10:58 1.txt
-rw-r--r--  1 root  wheel   273 Jul 27 10:58 2.txt
-rw-r--r--  1 root  wheel   411 Jul 27 10:58 3.txt
-rw-r--r--  1 root  wheel   552 Jul 27 10:58 4.txt
-rw-r--r--  1 root  wheel  1371 Jul 27 10:57 file
-rw-r--r--  1 root  wheel     0 Jul 27 11:04 test.file
# ls -l $1 | awk 'NR>1{min=min?min:$5}{if(min >$5)min=$5}{if(max<$5)max=$5;suma+=$5}END{printf "min=%d max=%d suma=%d", min,max,suma}'
min=0 max=1371 suma=2742[11:04:49]#

I don't understand why it doesn't work for me :S :S

Anyway, can u explain me what u do in the code? I want to understand what I do

I don't understand " min = min ? min : $5 ". min = min it's always true.. not? :S

Thanks man

I will try :cool:

# 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
         }
'

Many thanks !