Recherche…


Données tabulaires de traitement robustes (CSV et al.)

Le traitement des données tabulaires avec awk est très simple, à condition que l'entrée soit correctement formatée. La plupart des logiciels produisant des données tabulaires utilisent des caractéristiques spécifiques de cette famille de formats, et les programmes awk traitant des données tabulaires sont souvent spécifiques à des données produites par un logiciel spécifique. Si une solution plus générique ou robuste est requise, la plupart des langages populaires fournissent des bibliothèques prenant en charge de nombreuses fonctionnalités des données tabulaires:

  • noms de colonne facultatifs sur la première ligne
  • mélange de valeurs de colonnes cotées et non cotées
  • divers délimiteurs
  • formats localisés pour les nombres flottants

Bien qu'il soit possible de gérer toutes ces fonctionnalités de manière propre et générique avec awk, cela ne vaut probablement pas la peine.

Échange de deux colonnes en données tabulaires

Étant donné un fichier utilisant ; en tant que délimiteur de colonne. Permuter la première et la deuxième colonne est accompli par

awk -F';' -v 'OFS=;' '{ swap = $2; $2 = $1; $1 = swap; print }'

Calculer la moyenne des valeurs dans une colonne à partir de données tabulaires

Étant donné un fichier utilisant ; en tant que délimiteur de colonne. Nous calculons la moyenne des valeurs dans la deuxième colonne avec le programme suivant, l'entrée fournie est la liste des notes d'un groupe d'étudiants:

awk -F';' '{ sum += $2 } END { print(sum / NR) }' <<EOF
Alice;2
Victor;1
Barbara;1
Casper;4
Deborah;0
Ernest;1
Fabiola;4
Giuseppe;4
EOF

La sortie de ce programme est 2.125 .

N'oubliez pas que NR contient le numéro de la ligne en cours de traitement. Dans le bloc END , il contient donc le nombre total de lignes du fichier.

Rappelez-vous que dans de nombreuses applications (surveillance, statistiques) , la médiane est une information beaucoup plus utile. Voir l'exemple correspondant.

Sélection de colonnes spécifiques dans des données tabulaires

Nous supposons un fichier en utilisant; en tant que délimiteur de colonne. La sélection d'un ensemble spécifique de colonnes nécessite uniquement une instruction d' impression . Par exemple, le programme suivant sélectionne les colonnes 3, 4 et 7 de son entrée:

awk -F';' -v 'OFS=;' '{ print $3, $4, $7 }'

Il est comme d'habitude possible de choisir plus soigneusement les lignes à imprimer. Le programme suivant sélectionne les colonnes 3, 4 et 7 de son entrée lorsque le premier champ est Alice ou Bob :

awk -F';' -v 'OFS=;' '($1 == "Alice") || ($1 == "Bob") { print $3, $4, $7 }'

Calculer la médiane des valeurs dans une colonne à partir de données tabulaires

Étant donné un fichier utilisant ; en tant que délimiteur de colonne. Nous calculons la médiane des valeurs dans la deuxième colonne avec le programme suivant, écrit pour GNU awk . L'entrée fournie est la liste des notes d'un groupe d'étudiants:

gawk -F';' '{ sample[NR] = $2 }
 END {
   asort(sample);
   if(NR % 2 == 1) {
     print(sample[int(NR/2) + 1])
   } else {
     print(sample[NR/2])
   }
}' <<EOF
Alice;2
Victor;1
Barbara;1
Casper;4
Deborah;0
Ernest;1
Fabiola;4
Giuseppe;4
EOF

Le résultat de ce programme est 1 .

N'oubliez pas que NR contient le numéro de la ligne en cours de traitement. Dans le bloc END , il contient donc le nombre total de lignes du fichier.

De nombreuses implémentations de awk ne permettent pas de trier les tableaux, qui doivent donc être définis avant que le code ci-dessus puisse être utilisé.

Sélection d'un ensemble de lignes entre deux motifs

La correspondance de modèle peut être utilisée efficacement avec awk car elle contrôle les actions qui la suivent, par exemple { pattern } { action } . Un bon usage de la correspondance de modèle consiste à sélectionner plusieurs modèles dans un fichier, par exemple patternA et patternB

$ awk '/patternA/,/patternB/' file

Supposons que le contenu de mon fichier soit comme suit et que je souhaite extraire les lignes uniquement entre le modèle ci-dessus: -

$ cat file
This is line - 1
This is line - 2
patternA
This is line - 3
This is line - 4
This is line - 5
patternB
This is line - 6

$ awk '/patternA/,/patternB/' file
patternA
This is line - 3
This is line - 4
This is line - 5
patternB

La commande ci-dessus ne fait aucune { action } autre que pour imprimer les lignes correspondant, mais toutes les actions spécifiques du sous-ensemble de lignes peuvent être appliquées avec un bloc d'action ( {} ).



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow