Pense-bête awk

English   |   Source

Pour analyser rapidement et facilement des fichiers ou des sorties de commandes bash, awk s'avère en général particulièrement utile et pratique.

Calculer une moyenne et une médiane

On peut facilement calculer une moyenne (sur la dernière colonne d'un fichier par exemple) :

cat file | awk '{sum += $NF} END {printf "Average: %.3f\n", sum/NR}'

Qu'on peut améliorer pour cacluler également l'écart-type :

cat file | awk '{sum += $NF; sq += $NF^2} END {printf "Average: %.3f\nStddev:  %.3f", sum/NR, sqrt(sq/NR - (sum/NR)^2}'

Il est également possible de calculer une médiane ; l'astuce est de trier la colonne que l'on souhaite analyser :

cat file | awk '{print $NF}' | sort | awk '{a[i++] = $NF} END {printf "Median: %.3f\n", a[int(NR/2)]}'

Trouver le minimum et le maximum

La principale astuce et de ne pas oublier d'initialiser les variables min et max :

cat file | awk 'NR == 1 {min = $NF; max = $NF} NR > 1 {min=min<$NF?min:$NF; max=max>$NF?max:$NF+0} END {printf "Min: %.3f\nMax: %.3f\n", min, max}'

Conversion d'unité de temps

Il est aisé de faire du calcul flottant en awk et les possibilités sont donc presque infinies. Un exemple concret, pour convertir des millisecondes en minutes (avec secondes) :

awk '{printf "%d, %d min %.3f s\n", $2, $(NF-1)/1000/60,($(NF-1)/1000-(int($(NF-1)/1000/60)*60))}'

Tronquer et arrondir

Pour tronquer, deux solutions :

awk '{printf "%d\n", $NF}'

ou

awk '{printf "%d\n", int($NF)}'

Et pour arrondir :

awk '{printf "%.0f\n", $NF}'