Hoy me pareció interesante compartir una situación real. En un archivo delimitado por comas se extrajo la siguiente información: código de producto, cantidad disponible, cantidad requerida, y cantidad restante. El objetivo es mostrar los tres primeros campos como están, mientras que en el último campo debe aparecer (disponible – requerida) si hay suficiente cantidad o la leyenda No alcanza de otra manera. En esta oportunidad veremos cómo realizar esto mediante cálculos con awk desde la línea de comandos.
Cálculos con awk
Consideremos un extracto del archivo en cuestión. Por simplicidad le llamaremos extracto.csv:
80123214,15,4,11 90238914,20,25,-5 87802351,11,12,-1 80081231,20,15,5 87879901,10,12,-2 80261872,30,23,7 87801204,20,25,-5 92012301,15,27,-12 82829999,30,19,11 86713405,18,18,0
Como recordaremos de un post anterior, es posible realizar comparaciones con awk
. Solamente debemos especificar qué caracter actúa como separador de campos e indicar cuáles deben ser parte de la comparación. Sin embargo, en esta oportunidad también se necesita mostrar un mensaje si la comparación no cumple con la condición establecida.
Recordando que cada campo es representado por su posición en la línea con un signo $ delante, tenemos lo siguiente:
- $1, $2, $3, $4 representan el código de producto, la cantidad disponible, la cantidad requerida, y el resto, respectivamente.
- Si $3 <= $2, la cantidad restante debe aparecer tal cual está ($2 – $3 = $4).
- Si $3 > $2 se debe mostrar la leyenda No alcanza en $4.
- Las variables FS y OFS nos permiten indicar el caracter que debe actuar como separador de campos en la entrada (FS) y en la salida (OFS).
Si ejecutamos el siguiente comando
awk '{if ($3<=$2) print $1,$2,$3,$4; else print $1,$2,$3,"No alcanza"}' FS=, OFS=, extracto.csv
obtendremos el resultado deseado, tal como podemos ver en la Fig. 1:
Como podemos ver, además de un if hemos utilizado un else para indicar un curso alternativo que se debe tomar si no se cumple la condición especificada. Además, hemos mostrado cómo hacer una edición in place del archivo original en este último caso.
Espero que este post les haya resultado útil. ¡Nos leemos en breve!