A l’heure où le gigaoctet se vend à moins de 0,10€, on applique facilement la règle du « qui peut le plus peut le moins » et on cherche à être le plus exhaustif dans l’enregistrement de nos données. Mais parfois, il arrive que cet excès de zèle nous coince par la suite, du fait de fichiers trop volumineux pour le post-traitement. Pour alléger un tel fichier (sous réserve qu’il ne soit pas binaire bien sûr), une solution simple est bien sûr de supprimer un nombre significatif de ses lignes. Reste à savoir comment automatiser cette solution…
Le logiciel qui va nous sauver ici est awk, ou plus précisément GNU awk (souvent appelé gawk). C’est un programme en ligne de commande qui permet le traitement automatisé de données contenues dans des fichiers texte. Dans ce billet, je ne vais pas vous apprendre la syntaxe complète, mais plutôt vous donner les principales commandes qui sauvent.
Table des matières
Ne garder qu’une ligne sur deux
awk 'NR%2==0{print $0}' grosfichier.txt > fichierLight.txt |
Si vous souhaitez être plus radical encore et enlever plus de lignes, remplacer le 2 par la fréquence souhaitée.
Garder X lignes sur Y
awk 'NR%Y<X{print $0}' grosfichier.txt > fichierUnPeuLight.txt |
Tous les blocs de Y lignes, on ne gardera que les X premières.
Sélectionner les lignes où apparait une valeur
awk '/Essai1/' grosfichier.txt > essai1.txt |
Dans cet exemple, ne seront enregistrées que les lignes ou apparaît l’expression « Essai1 ».
Sélectionner les lignes dont la n-ième composante vaut « valeur »
awk '$n ~ /valeur/' grosfichier.txt > DataValeur.txt |
Les composantes (ou colonnes) doivent être séparées par défaut par des espaces ou des tabulations. On peut bien entendu choisir le séparateur grâce à l’option -F ; exemple avec des point-virgules :
awk -F\; '$n ~ /valeur/' grosfichier.txt > DataValeur.txt |
Supprimer les lignes identiques
awk '!x[$0]++' grosfichier.txt > fichierPropre.txt |
Explication rapide
Sous awk
, on parle d’enregistrement et de champ, respectivement pour les lignes et les colonnes. Le n-ième champ est enregistré dans la variable $n
($0
étant la totalité des champs). La variable NR
donne le nombre d’enregistrement déjà lus (à 1 près, le numéro de la ligne donc). Entre accolades est donnée l’action à appliquer quand la condition entre guillemets est vraie.
Les opérateurs %
et ~
sont respectivement le reste de la division et la condition de contenu.
Pour aller plus loin
Je ne vous ai pas menti, ce n’est ici qu’une très très infime partie de ce que awk propose de faire. Entre autre, on peut ajouter des colonnes à des fichiers, faire des opérations mathématiques sur les valeurs, changer le format des nombres…
Si vous voulez en savoir plus, je vous conseille le tutoriel awk de Nyal. Vous pouvez aussi trouver des exemples de scripts ici.