{"id":199,"date":"2018-11-12T16:05:54","date_gmt":"2018-11-12T15:05:54","guid":{"rendered":"https:\/\/sigeo.cerege.fr\/?p=199"},"modified":"2020-09-24T16:54:16","modified_gmt":"2020-09-24T14:54:16","slug":"awk-traitement-des-fichiers-texte","status":"publish","type":"post","link":"https:\/\/sigeo.cerege.fr\/?p=199","title":{"rendered":"AWK traitement de fichier texte"},"content":{"rendered":"<p>La commande unix <strong>a<em>wk<\/em><\/strong> permet des manipulations avanc\u00e9es sur les cha\u00eenes de caract\u00e8res.<\/p>\n<p><code>awk [options] [programme] [fichier]<\/code><\/p>\n<p>L&#8217;option la plus courante est -F : s\u00e9parateur de champ<\/p>\n<p>La structure du programme est la suivante :<br \/><code>'motif1 { action1 }<br \/>\nmotif2 { action2 } \u2026'<\/code><\/p>\n<p>motif (en anglais pattern) est la condition pour r\u00e9aliser l&#8217;action. On utilise le plus souvent une expression r\u00e9guli\u00e8re.<\/p>\n<h3>Exemple 1 : condition<\/h3>\n<p>avec un fichier ASCII &#8220;i<em>nput.xyz&#8221;<\/em> de la forme suivante (donn\u00e9es Lidar) :<\/p>\n<pre>13.83535621 42.12214528 401.940 32 2\n13.83534713 42.12213870 401.870 28 2\n13.83533818 42.12213222 401.670 33 2\n13.83532879 42.12211645 401.950 30 1\n13.83533763 42.12212258 401.630 28 2\n13.83534682 42.12212933 401.830 29 2\n13.83535625 42.12213609 402.250 25 1<\/pre>\n<p>on veut ne conserver que les lignes o\u00f9 la 5\u00e8me colonne est diff\u00e9rente de 1<\/p>\n<p><code>awk '{ if ( $5!=1 ) print $0 }' input.xyz &gt; output.xyz<\/code><\/p>\n<p>et voil\u00e0! c&#8217;est tout<\/p>\n<h3>Exemple 2 : utilisation dans un script<\/h3>\n<p>on a un fichier texte avec diff\u00e9rents espacements entre colonne, parfois un espace, parfois plusieurs. C&#8217;est le cas des fichiers en sortie du logiciel Circ\u00e9 IGN qui sont formatt\u00e9s vraiment bizarrement. Il contiennent parfois un et parfois plein d&#8217;espaces entre les champs, et des lignes d&#8217;ent\u00eate qui commencent par *! , voici un extrait d&#8217;un fichier en sortie de Circ\u00e9.<\/p>\n<pre>*!COORDONN\u00c9ES: projet\u00e9es\n*!ELLIPSO\u00cfDE: GRS 1980\n*!PROJECTION: LAMBERT-93\n*!REPERE VERTICAL: IGN69\n*!\n*! id E N H geod.prec. vert.prec.\npoint1 830488.865    6252042.364 0.558 -1.167384     542.6 no info 5 \/ 10 cm\npoint2 831546.415    6251863.871 6.043 -1.176810     544.3 no info 5 \/ 10 cm<\/pre>\n<p>Voici la manip pour reformatter cela simplement avec <em>awk<\/em> au sein d&#8217;un script.<\/p>\n<p><code>#! \/bin\/bash<\/code><\/p>\n<p><code>awk '$1!~\/*!\/ {$1=$1;print $0}' OFS=, &gt; out.csv<\/code><\/p>\n<p>pour utiliser le script, on tape simplement: <code>cat input.txt | .\/script.sh<\/code><\/p>\n<p>encore une fois, c&#8217;est tout!<\/p>\n<p><strong>Quelques explications :<\/strong><\/p>\n<ul>\n<li>la variable <code>$1<\/code> correspond au premier champ de l&#8217;enregistrement,<\/li>\n<li>la variable <code>$0<\/code> correspond \u00e0 tout l&#8217;enregistrement,<\/li>\n<li>la variable d\u00e9finie par <code>OFS<\/code> correspond au s\u00e9parateur de champ voulu en sortie, ici on d\u00e9finie une virgule<\/li>\n<li>L&#8217;action <code>{$1=$1;print $0}<\/code>effectue d&#8217;abord un calcul de champ avec <code>$1=$1<\/code>, ici on affecte au premier champ la valeur du premier champ. Donc on ne fait rien dans ce calcul, mais cela a pour effet de r\u00e9-\u00e9crire tout l&#8217;enregistrement avec le s\u00e9parateur de champ voulu (par d\u00e9faut un espace), et ainsi cela supprime tous les espaces superflus entre les champs et en d\u00e9but et fin d&#8217;enregistrement. Et ensuite avec <code>print $0<\/code>\u00a0 on \u00e9crie tout l&#8217;enregistrement dans la sortie standard.<\/li>\n<li>Le motif <code>$1!~\/*!\/<\/code> s\u00e9lectionne tous les enregistrements dont le premier champ ne contient pas \u00e0 la cha\u00eene de caract\u00e8res *!<\/li>\n<\/ul>\n<h3>Exemple 3 : supprimer tous les espaces superflus<\/h3>\n<p><code>awk '{$1=$1}1' input.csv &gt; output.csv<\/code><\/p>\n<ul>\n<li>L&#8217;action <code>{$1=$1}<\/code> voir Exemple 2 ci-dessus<\/li>\n<li>Le <code>1<\/code> situ\u00e9 apr\u00e8s les accolades <code>{}<\/code> est un motif correspondant \u00e0 Vrai, et lorsqu&#8217;il n&#8217;y a pas d&#8217;action situ\u00e9e apr\u00e8s le motif c&#8217;est l&#8217;action par d\u00e9faut print qui est execut\u00e9e, donc chaque ligne est \u00e9crite dans la sortie standard.<\/li>\n<\/ul>\n<h3>Exemple 4 : cha\u00eener les commandes en bash<\/h3>\n<p>exemple tir\u00e9 de <a href=\"https:\/\/www.the-art-of-web.com\/system\/imagemagick-watermark\/\">https:\/\/www.the-art-of-web.com\/system\/imagemagick-watermark\/<\/a><\/p>\n<p><code>ls -1 photos\/process_*.jpg | awk -F\\\/ '{print \"composite -gravity SouthEast -dissolve 50% -resize 400 watermark.png photos\/\"$(NF)\" watermarked\/\"$(NF)}' | sh<br \/><\/code><\/p>\n<p>Cette commande permet d&#8217;ajouter une trame en surimpression (watermark) sur toute une s\u00e9rie d&#8217;images de fa\u00e7on automatique avec l&#8217;outil &#8220;composite&#8221; (un des outils d&#8217;Imagemagick). awk sert ici \u00e0 \u00e9crire la commande de &#8220;composite&#8221; avec tous les fichiers renvoy\u00e9s par la commande &#8220;ls &#8230;&#8221;.<\/p>\n<p>Cet exemple est int\u00e9ressant car on voit bien l&#8217;int\u00e9r\u00eat de awk pour scripter des t\u00e2ches. On cha\u00eene ici trois commandes avec des pipes. La premi\u00e8re liste les photos correspondant \u00e0 un certain pattern, la seconde \u00e9crit une commande &#8220;composite&#8221; et la troisi\u00e8me ex\u00e9cute cette commande &#8220;composite&#8221;.<\/p>\n<h3>Quelques exemples tir\u00e9s de la page <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Awk\" target=\"_blank\" rel=\"noopener noreferrer\">Wikipedia<\/a><\/h3>\n<ul>\n<li><code>awk '{print $0}' fichier<\/code>\u00a0: affiche toutes les lignes de <i>fichier<\/i> (idem que <code>cat fichier<\/code>).<\/li>\n<li><code>awk '\/2\/ {print $0}' fichier<\/code>\u00a0: affiche toutes les lignes o\u00f9 le caract\u00e8re 2 est pr\u00e9sent (idem que <code>grep '2' ref.txt<\/code>).<\/li>\n<li><code>awk '$1~\/2\/ {print $0}' fichier<\/code>\u00a0: affiche toutes les lignes o\u00f9 le caract\u00e8re 2 est pr\u00e9sent dans le premier champ.<\/li>\n<li><code>awk '{print NR \":\", $0}' fichier<\/code>\u00a0: affiche le contenu de <i>fichier<\/i>, mais chaque ligne est pr\u00e9c\u00e9d\u00e9e de son num\u00e9ro.<\/li>\n<li><code>awk -F: '{print $1}' \/etc\/passwd<\/code>\u00a0: renvoie la liste des utilisateurs (idem <code>cut -d\u00a0: -f 1 \/etc\/passwd<\/code>).<\/li>\n<li><code>awk 'BEGIN {FS = \":\"}{print $1}' \/etc\/passwd<\/code>\u00a0: idem que la pr\u00e9c\u00e9dente commande<\/li>\n<li><code>awk '{s=s+$1} END {print s, s\/NR}' fichier<\/code> : \u00e9crit la somme et la moyenne de tous les nombres de la premi\u00e8re colonne de <i>fichier<\/i>.<\/li>\n<li><code>awk '\/Motif1\/ , \/Motif2\/' fichier<\/code>\u00a0: \u00e9crit toutes les lignes contenues dans le <i>fichier<\/i> entre le Motif1 et le Motif2.<\/li>\n<\/ul>\n<h2>References:<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.shellunix.com\/awk.html\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.shellunix.com\/awk.html<\/a><\/li>\n<li><a href=\"https:\/\/www.unix.com\/shell-programming-and-scripting\/180717-delete-row-specific-value-certain-column.html\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.unix.com\/shell-programming-and-scripting\/180717-delete-row-specific-value-certain-column.html<\/a><\/li>\n<li><a href=\"https:\/\/fr.wikipedia.org\/wiki\/Awk\">https:\/\/fr.wikipedia.org\/wiki\/Awk<\/a><\/li>\n<li><a href=\"http:\/\/www.cheat-sheets.org\/saved-copy\/awk_quickref.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/www.cheat-sheets.org\/saved-copy\/awk_quickref.pdf<\/a><\/li>\n<li><a href=\"https:\/\/rc.fas.harvard.edu\/wp-content\/uploads\/2017\/03\/AWK.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/rc.fas.harvard.edu\/wp-content\/uploads\/2017\/03\/AWK.pdf<\/a><\/li>\n<\/ul>\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>La commande unix awk permet des manipulations avanc\u00e9es sur les cha\u00eenes de caract\u00e8res. awk [options] [programme] [fichier] L&#8217;option la plus courante est -F : s\u00e9parateur de champ La structure du programme est la suivante :&#8217;motif1 { action1 } motif2 { action2 } \u2026&#8217; motif (en anglais pattern) est la condition pour r\u00e9aliser l&#8217;action. On utilise &hellip; <a href=\"https:\/\/sigeo.cerege.fr\/?p=199\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;AWK traitement de fichier texte&#8221;<\/span><\/a><\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-199","post","type-post","status-publish","format-standard","hentry","category-geo-traitements"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=\/wp\/v2\/posts\/199","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=199"}],"version-history":[{"count":18,"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=\/wp\/v2\/posts\/199\/revisions"}],"predecessor-version":[{"id":540,"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=\/wp\/v2\/posts\/199\/revisions\/540"}],"wp:attachment":[{"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=199"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=199"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sigeo.cerege.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}