Alléger un fichier texte trop lourd

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.

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.