Awk permet de traiter des fichiers texte, c’est presque un langage de programmation tellement il est puissant et permet de faire des chose incroyables en ligne de commande et encore plus dans un script shell.
Quand a-t-on besoin de Awk?
Quand vous avez des fichier de type texte, et qui sont une suite de lignes de même format, typiquement un fichier CSV, que vous devez faire un traitement sur ce fichier afin d’afficher les informations sur un autre format.
Par exemple soit un fichier CSV, qu’on doit transformer en requête SQL afin de faire un import de ce fichier SQL dans une base de données, vous me direz il est possible d’importer un fichier CSV dans PhpMyadmin par exemple, je vous dirai oui mais si vous deviez faire une transformation quelconque?
Soit le fichier texte suivant :
gold 1 1986 USA American Eagle gold 1 1908 Austria-Hungary Franz Josef 100 Korona silver 10 1981 USA ingot gold 1 1984 Switzerland ingot gold 1 1979 RSA Krugerrand gold 0.5 1981 RSA Krugerrand gold 0.1 1986 PRC Panda silver 1 1986 USA Liberty dollar gold 0.25 1986 USA Liberty 5-dollar piece silver 0.5 1986 USA Liberty 50-cent piece silver 1 1987 USA Constitution dollar gold 0.25 1987 USA Constitution 5-dollar piece gold 1 1988 Canada Maple Leaf
A première vue ce fichier est de type à séparation par tabulation, car les champs commencent à des positions bien définies, nous allons faire des traitement avec Awk sur ce fichier puis, nous allons transformer en requête SQL chaque ligne.
Commandes basiques de awk
$ awk '/gold' test.txt
ce qui est équivalent à
$ grep gold coins.txt
Si vous ne connaissez pas la commande grep
, cette dernière cherche une chaine de caractère dans un fichier ou des fichiers. On fait une recherche de la chaine et on l’affiche. Donc jusqu’ici rien d’extraordinaire, car grep
peut le faire. Voyons voir, et si on n’affichait que quelques colonnes, comme la première et la troisième?
awk '{print $1,$3}' text.txt
gold 1986 gold 1908 gold 1984 gold 1979 gold 1981 gold 1986 gold 1986 gold 1987 gold 1988
On n’est pas obligé d’afficher dans l’ordre, il importe peu, ce qui commence par un signe $, c’est une capture de champ,
awk '{print $3,$2}' test.txt
Le pattern général de awk est:
awk search pattern { program actions }
fichier
Par défaut si vous mettez une virgule entre les captures de champs, il y a un espace qui les sépare. Mais comment fiat-on si on a plusieurs espaces?
awk -F";" '{print $1 " " $3}' test.txt
Création d’une requête SQL avec Awk
Nous allons maintenant faire quelque chose de plus intéressant, transformer ce fichier en une requête SQL. Nous allons donc carrément mettre du SQL dans la commande Awk:
awk -F'\t' '{ print "INSERT INTO prospects (prenom,nom,civilite,email,service,random_id) VALUES (" $3","$2","$4","$1","$5","$6 ")" }' test> import.sql