Trier et supprimer les doublons d\’un fichier sous Linux

\"Terminal\"Dans le cadre du débuggage d\’un programme C, j\’ai été amené à écrire dans un fichier plus de 5 millions de valeurs numériques dans le but de les trier ensuite et de supprimer les doublons (\ »Ah le mec qui debug avec des printf()!\ » – Ouai ben des fois y\’a que ça d\’efficace!) . Une fois ce fichier généré, soit environ 40Mo, je me suis posé la question de l\’outil à utiliser pour effectuer les opérations dont j\’avais besoin. J\’ai pensé à plusieurs choses :

  • Ouvrir le fichier avec LibreOffice Calc mais il se trouve que celui-ci est limité à un peu plus de 100 000 lignes et ne permet donc pas d\’exploiter mon fichier.
  • Insérer en base de données les valeurs et effectuer les opérations en SQL. Problème : Il faut une base de données à disposition d\’une part et si c\’est le cas, MySQL via PhpMyAdmin refuse d\’importer le fichier car il est, semble-t-il, trop volumineux.
  • Écrire un programme qui lit le fichier, stocke toutes la valeurs dans un tableau et effectue les opérations nécessaires. Seulement voilà, on n\’a pas forcément l\’envie ni le temps d\’écrire un programme pour un traitement aussi commun.

Bref, c\’est là qu\’intervient Linux et la puissance des outils qui lui sont associés. Dans un terminal :

$ sort -g mon_fichier | uniq > mon_nouveau_fichier

C\’est aussi simple que ça! Et le temps d\’exécution est très raisonnable :

$ time sort -g mon_fichier | uniq > mon_nouveau_fichier 

real	0m8.013s
user	1m0.326s
sys	0m0.403s

Quelques brèves explications :

  • sort -g permet le tri en prenant l\’ordre des valeurs numériques et pas l\’ordre alphanumérique classique. Sans cette option, on aurait un résultat de ce type : 1, 10, 100, 1000, 11, 110, 1110, …
  • uniq permet de supprimer les doublons et de renvoyer les valeurs uniques.

Certes ce n\’est pas quelque chose dont on a besoin tous les jours mais ça permet de montrer encore une fois la diversité et la puissance des outils fournis sous Linux. Et ça encourage à chercher du côté de ces petits utilitaires avant de tenter des choses improbables ou de réinventer la roue…

Manuel de sort
Manuel de uniq

EDIT : Il est aussi possible d\’effectuer le tout (tri + suppression des doublons) en ajoutant -u au sort. On aura donc sort -gu mon_fichier > mon_nouveau_fichier. Au niveau du temps d\’exécution il n\’y a aucune différence et le résultat est identique. Merci AP pour l\’info!

Gestion des chemins dans le terminal avec pushd et popd

\"Terminal\"On a beau être un fervent utilisateur du terminal, on découvre régulièrement de nouvelles fonctionnalités qui nous font gagner du temps et qui nous paraissent finalement indispensables. Parmi elles, je viens juste d\’apprendre l\’existence des commandes pushd et popd; le \ »d\ » final faisant référence à \ »directory\ ». Ces deux commandes servent à gérer une pile de chemins. La première ajoute au dessus de la pile le chemin courant puis le chemin passé en paramètre et se rend à ce dernier. La seconde dépile le premier élément et se rend au nouveau premier élément. Un exemple concret de navigation classique depuis le terminal :

login@ubuntu:~/Documents/blog/articles$ cd /var/log
login@ubuntu:/var/log$ do-something-amazing
login@ubuntu:/var/log$ cd ~/Documents/blog/articles
login@ubuntu:~/Documents/blog/articles$

En utilisant maintenant pushd et popd :

login@ubuntu:~/Documents/blog/articles$ pushd /var/log
# ici est affiché l\'état de la pile en partant du haut de celle-ci
/var/log  /home/login/Documents/blog/articles
login@ubuntu:/var/log$ do-something-very-amazing
login@ubuntu:/var/log$ popd
login@ubuntu:~/Documents/blog/articles$

Le but à terme est donc d\’utiliser autant que possible pushd à la place de cd de façon à gérer un historique de parcours de répertoires. Il est intéressant aussi de noter que la pile n\’est évidemment pas limitée à deux éléments! Ainsi, deux pushd d\’affilée permettront de revenir en arrière d\’autant. Enfin, une utilisation pratique peut être de faire :

login@ubuntu:~/Documents/blog/articles$ pushd .
~/Documents/blog/articles  ~/Documents/blog/articles

Ainsi, vous pouvez naviguer où bon vous semble le temps d\’effectuer une autre tâche (avec des cd) et revenir quand nécessaire dans ce répertoire grâce à un popd. Dernière chose, la commande dirs permet de fournir l\’état de la pile et d\’en gérer quelques aspects (la vider par exemple).

Fortune et Kaamelott

La commande fortune permet d\’afficher dans son terminal des citations en tout genre (extraits de livres, théorèmes, citations d\’hommes politiques, etc…). Bien que ce ne soit pas d\’une utilité flagrante, voire même carrément chronophage, une petite citation à chaque ouverture de terminal, par exemple, ajoute un peu de gaîté à une journée de travail pas toujours reluisante.

Pour l\’installer et ajouter des citations françaises :

$ sudo apt-get install fortune fortunes-fr

Ensuite l\’exécution se fait simplement en tapant la commande fortune éventuellement suivie d\’un des thèmes présent dans la liste issue de fortune -f.

Seulement voilà… Les citations incluses dans le paquet ne sont pas toujours fantastiques et parfois même incompréhensibles. Bref, suite à un journal posté sur LinuxFr concernant une fortune sur La Classe Américaine, je me suis lancé dans l\’écriture d\’un fichier contenant des citations de Kaamelott. Pour avoir une bonne base, je suis parti sur celles proposées sur Wikiquote. Après avoir ajoutées les extraits de la page principale et des pages dérivées (Arthur, Léodagan, Perceval, Karadoc, etc…) j\’arrive à un total de 505 entrées ce qui commence à être suffisamment correct pour le partager! Le fichier texte se trouve ici. Une fois que vous l\’aurez enregistrer, ouvrez un terminal et allez dans le répertoire contenant ce fichier texte puis :

$ mv kaamelott.txt kaamelott
$ strfile kaamelott
\"kaamelott.dat\" created
There were 505 strings
Longest string: 2166 bytes
Shortest string: 50 bytes

La comamnde strfile va générer un fichier .dat lisible par fortune. Il suffit ensuite de copier ces deux fichier dans le répertoire approprié :

$sudo cp kaamelott kaamelott.dat /usr/share/games/fortunes/

Le tour est joué! La preuve :

$ fortune kaamelott
Un village assailli de brigands, une femme qui se fait tabasser, une poule qui boîte,
c est pas les opprimés qui manquent ! Et là au moins, j aurais l impression de servir
à quelque chose.
[Lancelot, Livre III, 1 : Le chevalier errant]
$

Enfin, pour avoir une citation au lancement de son terminal il suffit d\’ajouter cette commande dans son fichier ~/.bashrc.

Le manuel de la commande fortune se trouve . Un explication détaillé est également disponible ici.

Si vous avez des suggestions de citations à ajouter, ce sera avec plaisir! Postez les dans les commentaires et je me chargerai du reste. Si vous pouvez en plus fournir le nom et le numéro de l\’épisode, alors là c\’est parfait!

Planifier une execution avec at

\"Clock\"Lorsque l\’on souhaite planifier de façon régulière l\’exécution d\’une commande ou d\’un script, le plus efficace reste l\’utilisation de cron. En revanche, lorsqu\’il s\’agit d\’une action unique, il existe une commande linux très pratique : at. L\’utilisation de base pour une planification dans la journée est assez simple. Il suffit de faire suivre at de l\’heure à laquelle on souhaite exécuter la commande ou le script en concaténant les heures et les minutes. Après avoir pressé la touche <entrée> un prompt s\’ouvre pour y tapper la ou les commandes souhaitées chacune suivie d\'<entrée>. Après la dernière commande, un Ctrl+D validera la planification. Par exemple, pour lancer le script synchro.sh aujourd\’hui à 23h30 :

$ at 2330
warning: commands will be executed using /bin/sh
at> sh ~/synchro.sh
at> 
job 7 at Tue Jun 29 23:30:00 2010
$

Plusieurs options sont proposées pour personnaliser un peu plus l\’exécution. On peut citer en particulier le paramètre -l permettant de lister les planifications en cours :

$ at -l
7	Tue Jun 29 23:30:00 2010 a username
$

ou encore la commande atrm suivie de l\’id de la tâche pour la supprimer.

$ at -l
7	Tue Jun 29 23:30:00 2010 a username
$ atrm 7
$ at -l
$

Pour le manuel de la commande, c\’est par là.

sl ou comment s\’auto-flageller

Tous les utilisateurs de linux familiers avec la ligne de commande se sont retrouvés un jour avec cette faute de frappe :

user@server:~# sl
-bash: sl: command not found
user@server:~#

De façon à se punir de cette coquille, il existe une commande dont la description est plutôt claire :

sl – display animations aimed to correct users who accidentally enter sl instead of ls.

Cette commande fait passer un train en ASCII dans le terminal. Pour couronner le tout, on ne peut d\’une part pas tuer le processus (à moins de spécifier le paramètre -e mais là c\’est clairement plus une faute de frappe !!!) et d\’autre part les principaux paramètres à la commande ls, à savoir le -l et le -a, sont également implémentés dans sl. Le premier affichera un train plus petit et le second fera appeler au secours les passagers avec des \ »help!\ ».

\"Commande

Bref, c\’est inutile, énervant et relève du masochisme : autant dire indispensable! Donc pour l\’installer c\’est comme d\’habitude :

sudo apt-get install sl

Et le manuel est là : manuel sl.