tag:linuxfr.org,2005:/tags/awk/publicLinuxFr.org : les contenus étiquetés avec « awk »2023-01-10T13:04:56+01:00/favicon.pngtag:linuxfr.org,2005:Post/433892023-01-10T08:47:28+01:002023-01-11T12:05:45+01:00[awk] mettre une variable sur print<p>Bonjour,</p>
<p>j'ai besoin d'un coup de main pour solutionner mon soucis.<br>
J'utilise cette ligne de commande.</p>
<pre><code class="sh">pdfgrep --max-count <span class="m">1</span> <span class="s2">"Date"</span> <span class="nv">$fichier1</span> <span class="p">|</span> awk <span class="s1">'{print $9}'</span></code></pre>
<p>elle me permet de détecter un champs sur un pdf. Par contre mon soucis :<br>
la colonne n'est toujours pas 9, elle peut être la 10 à 12.</p>
<p>donc ma question :<br>
peut-t-on mettre une variable à la place $9?</p>
<p>merci de votre aide</p>
<div><a href="https://linuxfr.org/forums/programmation-shell/posts/awk-mettre-une-variable-sur-print.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/129938/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-shell/posts/awk-mettre-une-variable-sur-print#comments">ouvrir dans le navigateur</a>
</p>
clelouphttps://linuxfr.org/nodes/129938/comments.atomtag:linuxfr.org,2005:Post/433472022-12-21T17:51:33+01:002022-12-21T17:51:33+01:00Recherche commande<p>Bonjour,</p>
<p>J'ai ce fichier :<br>
XVI 931376 +<br>
XVI 933898 -<br>
XVI 934034 +<br>
XVI 938148 -<br>
XVI 939279 -<br>
XVI 939922 +<br>
XVI 943032 +<br>
XVI 943880 +<br>
XVI 944603 +<br>
XVI 946856 -</p>
<p>J'aimerais créer une variable qui, compte le nombre de "groupements +" de sorte à sortir :<br>
3 (le groupe de 4 plus compte pour 1).</p>
<p>Je recherche sur pleins de forums mais je ne trouve rien…<br>
Merci !</p>
<div><a href="https://linuxfr.org/forums/programmation-shell/posts/recherche-commande.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/129744/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-shell/posts/recherche-commande#comments">ouvrir dans le navigateur</a>
</p>
lena.25https://linuxfr.org/nodes/129744/comments.atomtag:linuxfr.org,2005:Bookmark/50722022-08-25T14:19:24+02:002022-08-25T14:19:24+02:00Unix legend, who owes us nothing, keeps fixing foundational AWK code<a href="https://arstechnica.com/gadgets/2022/08/unix-legend-who-owes-us-nothing-keeps-fixing-foundational-awk-code/">https://arstechnica.com/gadgets/2022/08/unix-legend-who-owes-us-nothing-keeps-fixing-foundational-awk-code/</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/128587/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/gilcot/liens/unix-legend-who-owes-us-nothing-keeps-fixing-foundational-awk-code#comments">ouvrir dans le navigateur</a>
</p>
Gil Cot ✔https://linuxfr.org/nodes/128587/comments.atomtag:linuxfr.org,2005:Bookmark/25782021-01-23T21:29:22+01:002021-01-24T17:38:44+01:00The etymology of command line tools<a href="https://i.redd.it/7xpwscsgk2d61.png">https://i.redd.it/7xpwscsgk2d61.png</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/123064/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/deuzene/liens/the-etymology-of-command-line-tools#comments">ouvrir dans le navigateur</a>
</p>
deuzenehttps://linuxfr.org/nodes/123064/comments.atomtag:linuxfr.org,2005:Diary/395572021-01-14T22:31:36+01:002021-01-16T09:54:46+01:00TapTempo contest : un peu moins d'octets en AwkLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Voici une implémentation de TapTempo encore plus compacte que l'indigeste one-liner Perl précédent (<a href="//linuxfr.org/users/zerodeux/journaux/taptempo-en-une-ligne">https://linuxfr.org/users/zerodeux/journaux/taptempo-en-une-ligne</a>), elle vous est offerte par Loïc Cerf qui me l'a soumise et me propose de vous la partager.</p>
<p>J'ai donc l'honneur de vous transmettre sa solution en 97 caractères :</p>
<pre><code class="bash">$ awk <span class="s1">'{system("date +%s%N")}'</span><span class="p">|</span>awk <span class="s1">'{t[++k]=$0}k>5{r=k-5}k>1{printf"%i",6e10*(k-r-1)/($0-t[r+1])}'</span></code></pre>
<p>Le comportement est identique à celui de la ligne Perl de Vincent. Elle considère notamment le temps il y a cinq tapes sur la touche Entrée, moins au début… mais je triche en imprimant <code>%i</code>, le seul tempo (un nombre entier), plutôt que <code>%i bpm</code> qui mènerait à 101 caractères.</p>
<p>La solution n'est pas particulièrement cryptique. Le premier programme AWK appelle <code>date +%s%N</code>, comme dans la solution en Bash de superna, à chaque appui sur la touche Entrée, <code>\n</code> séparant par défaut les "enregistrements" ("record" en anglais) en AWK. Le second programme reçoit donc des nombres de millisecondes depuis l'époque. Il les stocke<br>
dans <code>t[1]</code>, <code>t[2]</code>, etc., <code>$0</code> étant l'enregistrement entier en AWK, qui initialise <code>k</code> à 0 la première fois que la variable est utilisée (de façon numérique : ici, un incrément). Au premier enregistrement, rien n'est fait : les tests <code>k>5</code> et <code>k>1</code> échouent. Du second au cinquième, seul le test <code>k>1</code> passe et l'entier imprimé est le tempo calculé en considérant le dernier temps (<code>$0</code>), le premier (<code>t[r+1]</code> est <code>t[1]</code> puisque <code>r</code> vaut 0), le nombre d'intervalle (<code>k-1</code>) et le fait que le temps est en millisecondes plutôt qu'en minutes (facteur <code>6e10</code>). À partir du sixième enregistrement<br>
(<code>k>5</code>), <code>r</code> est défini comme étant <code>k-5</code> de sorte que le tempo est calculé en considérant le dernier temps (<code>$0</code>), le temps au <code>k-5+1 = k-4</code> ème enregistrement et donc <code>k-r-1 = k-(k-5)-1 = 4</code> intervalles.</p>
<p>J'avais au départ une solution similaire en 103 caractères (107 en écrivant " bpm"). J'ai proposé un défi TapTempo après avoir enseigné AWK ( <a href="https://dcc.ufmg.br/%7Elcerf/slides/mda6.pdf">https://dcc.ufmg.br/~lcerf/slides/mda6.pdf</a> ) à mes étudiants (je suis professeur à l'Université Fédérale du Minas Gerais, au Brésil) : réaliser la même chose en moins de caractères. Une étudiante a économisé trois caractères. J'ai ensuite encore gagné trois caractères.</p>
<p>Si l'un de vous deux veut participer au renouveau d'intérêt pour TapTempo, je n'ai rien contre un journal qui présente cette solution en moins de 100 caractères. Je suis en fait curieux de découvrir si quelqu'un trouvera une solution encore plus brève.</p>
<p>Loïc.</p>
<div><a href="https://linuxfr.org/users/zerodeux/journaux/taptempo-contest-un-peu-moins-d-octets-en-awk.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/122943/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/zerodeux/journaux/taptempo-contest-un-peu-moins-d-octets-en-awk#comments">ouvrir dans le navigateur</a>
</p>
zerodeuxhttps://linuxfr.org/nodes/122943/comments.atomtag:linuxfr.org,2005:Post/410212020-04-13T12:52:26+02:002020-04-13T12:52:26+02:00Modification d'un fichier, variable avec awk<p>Bonjour à tous, </p>
<p>Je voudrais modifier un associer une valeur à une variable avec awk en utilisant une autre variable (définie au début du programe). Voici un exemple simple qui illustre ce que je voudrais faire : </p>
<p>Pour le moment j’exécute la commande suivante : <br>
Re_tau_fr=$(awk 'FNR==119{print 0.0029846/$43*sqrt($39/$17*$2/($1))}' $moyenne_actuelle)</p>
<p>Je voudrais pouvoir changer le coefficient multiplicateur facilement en début de fichier, c'est à dire faire quelque chose comme : <br>
coeff="0.0029846"<br>
Re_tau_fr=$(awk 'FNR==119{print $coeff/$43*sqrt($39/$17*$2/($1))}' $moyenne_actuelle)</p>
<p>En utilisant BEGIN j'y arrive mais comment combiner BEGIN et FNR ? Y'a-t-il une autre solution si la combinaison est impossible ?</p>
<p>Merci d'avance pour vos réponses,<br>
Martin</p>
<div><a href="https://linuxfr.org/forums/linux-debutant/posts/modification-d-un-fichier-variable-avec-awk.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/120006/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/linux-debutant/posts/modification-d-un-fichier-variable-avec-awk#comments">ouvrir dans le navigateur</a>
</p>
MartinD07https://linuxfr.org/nodes/120006/comments.atomtag:linuxfr.org,2005:Bookmark/7522019-07-17T11:34:56+02:002019-07-17T11:34:56+02:00up, the ultimate plumber<a href="https://github.com/akavel/up">https://github.com/akavel/up</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/117714/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/palm123/liens/up-the-ultimate-plumber#comments">ouvrir dans le navigateur</a>
</p>
palm123https://linuxfr.org/nodes/117714/comments.atomtag:linuxfr.org,2005:Post/403142019-07-16T18:19:02+02:002019-07-17T11:07:19+02:00Script awk : Afficher le nom du fichier en cours de traitement ?<p>Bonjour,</p>
<p>Je suis bloqué sur un script et je ne sais pas comment m'en sortir. Je sollicite donc votre aide.</p>
<p>J'ai un script qui me permet d'afficher avec une mise en page des informations provenant de plusieurs CSV.</p>
<p>Voici le script :</p>
<pre><code class="sh"> cat /var/www/cgi-bin/LPAR_MAP/*.csv <span class="p">|</span> grep foo <span class="p">|</span> awk -F<span class="s1">',|;'</span> <span class="s1">'{print $2","$5","$6","$7}'</span> <span class="p">|</span> awk <span class="s1">'{</span>
<span class="s1"> print "LPARS :" $2</span>
<span class="s1"> print "RAM : " $5</span>
<span class="s1"> print "CPU 1 : " $6</span>
<span class="s1"> print "CPU 2 : " $7</span>
<span class="s1"> }'</span></code></pre>
<p>Ce script va afficher toutes les lignes des fichiers CSV, en ne gardant que les lignes contenant le mot " foo " et n'affichant que les colonnes 2,5,6 et 7.</p>
<p>Voici le type de CSV que je dois traiter :</p>
<blockquote>
<p>MO2PPC20;miaibv95;Running;AIX 6.1 6100-09-10-1731;60;0.6;4;DefaultPool;shared;uncap;64<br>
MO2PPC20;miaibv161;Running;AIX 6.1 6100-09-10-1731;60;1.2;4;DefaultPool;shared;uncap;128<br>
MO2PPC20;miaibv246;Running;AIX 6.1 6100-09-10-1731;12;0.5;1;DefaultPool;shared;uncap;64<br>
MO2PPC20;mplaix0088;Running;AIX 7.1 7100-05-02-1810;130;1.5;11;DefaultPool;shared;uncap;64<br>
MO2PPC20;mplaix0306;Running;AIX 7.1 7100-05-02-1810;180;0.5;3;DefaultPool;shared;uncap;64<br>
MO2PPC20;mplaix0087;Running;AIX 7.1 7100-05-02-1810;100;0.4;4;DefaultPool;shared;uncap;64<br>
MO2PPC20;miaibv182;Running;AIX 6.1 6100-09-10-1731;5;0.5;1;DefaultPool;shared;uncap;64<br>
MO2PPC20;mo2vio20b;Running;VIOS 2.2.5.20;7;1.0;2;DefaultPool;shared;uncap;192<br>
MO2PPC20;mo2vio20a;Running;VIOS 2.2.5.20;7;1.0;2;DefaultPool;shared;uncap;192<br>
MO2PPC21;mo2vio21b;Running;VIOS 2.2.6.10;6;1.5;3;DefaultPool;shared;uncap;192<br>
MO2PPC21;mo2vio21a;Running;VIOS 2.2.6.10;6;1.5;3;DefaultPool;shared;uncap;192<br>
MO2PPC21;oncwasp4;Running;AIX 6.1 6100-09-10-1731;15;0.6;2;DefaultPool;shared;uncap;128<br>
MO2PPC21;mplaix0122;Running;AIX 7.1 7100-05-02-1810;175;2.3;5;DefaultPool;shared;uncap;64</p>
</blockquote>
<p>Voici ce que ça donne en sorti :</p>
<pre><code>FRAME :
------------------
LPARS :mplaix0021
RAM : 11
CPU 1 : 1.0
CPU 2 : 2
LPARS :mplaix0005
RAM : 7
CPU 1 : 0.5
CPU 2 : 2
LPARS :mplaix0025
RAM : 400
CPU 1 : 36.0
CPU 2 : 46
LPARS :mplaix0019
RAM : 120
CPU 1 : 4.0
CPU 2 : 8
LPARS :mplaix0003
RAM : 26
CPU 1 : 0.5
CPU 2 : 2
LPARS :mplaix0007_OLD_DNTSTART
RAM : 0.25
CPU 1 : 0.7
CPU 2 : 7
LPARS :mplaix0009
RAM : 180
CPU 1 : 6.0
CPU 2 : 12
</code></pre>
<p>Le problème c'est que même si j'arrive à sélectionner seulement les lignes qui m’intéressent en faisant un grep sur certain mot( ici MO1PPC01 ), je ne sais pas à quel fichier appartiennent les informations affichées. L'idée serait d'avoir quelques choses dans ce style :</p>
<pre><code>FRAME :
------------------
File : XXXXX.csv
LPARS :mplaix0021
RAM : 11
CPU 1 : 1.0
CPU 2 : 2
LPARS :mplaix0005
RAM : 7
CPU 1 : 0.5
CPU 2 : 2
File : XXXX.csv
LPARS :mplaix0025
RAM : 400
CPU 1 : 36.0
CPU 2 : 46
LPARS :mplaix0019
RAM : 120
CPU 1 : 4.0
CPU 2 : 8
LPARS :mplaix0003
RAM : 26
CPU 1 : 0.5
CPU 2 : 2
File : XXXXXX.csv
LPARS :mplaix0007_OLD_DNTSTART
RAM : 0.25
CPU 1 : 0.7
CPU 2 : 7
LPARS :mplaix0009
RAM : 180
CPU 1 : 6.0
CPU 2 : 12
</code></pre>
<p>Bref, que je puisse afficher le nom du fichier avec, en dessous, les informations qui lui sont propres.</p>
<p>Auriez-vous une solution ? Merci d'avance ! :)</p>
<div><a href="https://linuxfr.org/forums/programmation-shell/posts/script-awk-afficher-le-nom-du-fichier-en-cours-de-traitement.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/117710/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-shell/posts/script-awk-afficher-le-nom-du-fichier-en-cours-de-traitement#comments">ouvrir dans le navigateur</a>
</p>
Makmyhttps://linuxfr.org/nodes/117710/comments.atomtag:linuxfr.org,2005:Post/392762018-06-05T17:34:33+02:002018-06-06T08:46:16+02:00Remplacer une valeur dans une colonne sous condition<p>Bonjour à tous,</p>
<p>J'ai une liste de fichiers textes contenant des valeurs séparées par des ; . Dans ces fichiers je dois remplacer la valeur de colonne 8 pour les lignes commençant par la valeur PAR.</p>
<p>Pour le moment j'utilise cette commande<br><code><br>
for i in `ls *.txt`; do cat $i | awk -i inplace -F";" '{ if($1=="PAR") {gsub("[^0-9]","3027008440109",$8);print} }'; done<br></code>Malheureusement sa marche pas vraiment, j'ai cette erreur<br><code><br>
awk: inplace:47: avertissement : inplace_begin : modification sur place annulée pour le fichier incorrect « - »<br></code>Je comprends pas vraiment l'erreur</p>
<p>Exemple de fichier :<br><code><br>
@GP;WEB@EDI;INVOIC;STANDARD;;;;<br>
ENT;06183032;23/05/2018;;;;29/05/2018;xxxxxxxxx;;;;;qqqqqqqqqq;31/05/2018 00:00;15/07/2018;FACTURE;EUR;08/06/2018;0;qqqqqqqqqq;;0;8;0;0;0;60;MAR;0;;<br>
DTM;263D;31/05/2018<br>
PAR;3027008446064;blablabla;3014597000104;blobloblo;3027008446064;bliblibli;3027008446064;blublublu;;;3014597000104;blablabla;;;<br>
LIG;1;3253560867751;REFE;1;0;PCE;2;19.92;EUR;;;20;38.84;0;DESI;39.84;;0;0;0;;;;;0;0;;;;0;0;;;0;;;;;;0;<br>
[...]<br></code></p><div><a href="https://linuxfr.org/forums/programmation-shell/posts/remplacer-une-valeur-dans-une-colonne-sous-condition.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/114651/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-shell/posts/remplacer-une-valeur-dans-une-colonne-sous-condition#comments">ouvrir dans le navigateur</a>
</p>
Philippe Mhttps://linuxfr.org/nodes/114651/comments.atomtag:linuxfr.org,2005:Diary/377772018-03-05T11:17:10+01:002018-03-05T11:17:10+01:00taptempo.awk : une approche plus unix ?Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Salut !</p>
<p>Ce journal s'inscrit dans la série des journaux traitant de portages de <a href="//linuxfr.org/tags/taptempo/public">taptempo</a>.</p>
<p>Pour bien commencer la semaine, je voulais proposer une alternative à taptempo sous forme de filtre. Ma version d'un compteur de tempo se base sur l'outil <code>xev</code> et ne possède aucune option. Il est plus rapide de modifier directement le script que d'en modifier.</p>
<p>Pour moi c'est l'occasion de présenter <code>awk</code>, un langage de script relativement peu connu/utilisé alors qu'il est très intéressant. Il fait, pour moi parti de mon armement de base en shell avec bash/zsh, grep, sed et perl.</p>
<h2 id="awk">Awk ?</h2>
<p>awk est un outil en ligne de commande qui permet de parser du texte. Il représente le texte comme des lignes et des colonnes. Le langage est particulièrement fait pour filtrer et découper les lignes selon les critères que l'on souhaite. Par défaut les retours à la ligne découpent les lignes et les champs (les colonnes) sont découpés sur les espaces (les champs vides sont ignorés).</p>
<p>Le code est organisé en bloc de code qui ont une condition devant eux. La condition peut être une expression régulière sur la ligne en cours de traitement, une condition "quelconque" (<em>est-ce que la variable foo est égale à 3 ?</em>), <code>BEGIN</code> ou <code>END</code>. Ces 2 dernier représentent le début et la fin du programme.</p>
<p>On accède à la ligne via des variables :</p>
<ul>
<li>
<code>$0</code> représente toute la ligne</li>
<li>
<code>$1</code>, <code>$2</code>,… le premier champ, le deuxième champ,…</li>
</ul><p>Attention les variables ne sont pas des copies de la ligne, mais une référence. Ça signifie que si j'affecte une valeur à <code>$1</code> alors <code>$0</code> en sera affecté. C'est plutôt pratique.</p>
<h3 id="astuces">Astuces</h3>
<p>A fin d'être shell ready, il y a différentes choses qui sont disponibles de bases pour réduire la taille des scripts.</p>
<ul>
<li>Les conditions sont optionnelles, un bloc sans condition sera toujours évalué ;</li>
<li>Les blocs sont optionnels : l’absence de bloc est équivalent à <code>{print $0}</code> ;</li>
<li>Beaucoup de fonctions de traitements de chaines prennent par défaut <code>$0</code>. Du coup <code>print</code> est équivalent à <code>print $0</code>.</li>
</ul><h3 id="dans-la-vie-quotidienne">Dans la vie quotidienne</h3>
<p>Dans la vie, j'utilise <code>awk</code> en remplacement de <code>grep</code> + <code>sed</code> ou en remplacement de <code>cut</code> (j'aime pas bien cut). Par exemple :</p>
<pre><code class="sh">grep foo fichier <span class="p">|</span> cut -f3</code></pre>
<p>sera remplacé par :</p>
<pre><code class="sh">awk <span class="s1">'/foo/{print $3}'</span> fichier</code></pre>
<h2 id="et-ton-taptempo-alors">Et ton taptempo, alors ?</h2>
<p>C'est pas vraiment un taptempo, c'est une alternative… Mais le voila :</p>
<pre><code class="awk"><span class="c1">#!/usr/bin/awk -f</span>
<span class="nb">BEGIN</span> <span class="p">{</span>
<span class="nx">size</span><span class="o">=</span><span class="mi">15</span><span class="p">.;</span>
<span class="nx">c</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="sr">/KeyPress event/</span><span class="p">{</span>
<span class="nx">k</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="nx">k</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">&&</span> <span class="sr">/^ root /</span><span class="p">{</span>
<span class="kr">sub</span><span class="p">(</span><span class="s2">","</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="o">$</span><span class="mi">6</span><span class="p">);</span>
<span class="nx">t</span><span class="p">[</span><span class="mi">1</span><span class="o">+</span><span class="p">(</span><span class="nx">c</span> <span class="o">%</span> <span class="nx">size</span><span class="p">)]</span><span class="o">=$</span><span class="mi">6</span><span class="p">;</span>
<span class="k">if</span><span class="p">(</span><span class="nx">c</span> <span class="o">></span> <span class="nx">size</span><span class="p">){</span>
<span class="nx">start</span><span class="o">=</span><span class="mi">1</span><span class="o">+</span><span class="nx">c</span><span class="o">%</span><span class="nx">size</span><span class="p">;</span>
<span class="nx">end</span><span class="o">=</span><span class="mi">1</span><span class="o">+</span><span class="p">(</span><span class="nx">c</span><span class="o">-</span><span class="nx">size</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="nx">size</span><span class="p">;</span>
<span class="nx">interval</span><span class="o">=</span><span class="nx">t</span><span class="p">[</span><span class="nx">start</span><span class="p">]</span><span class="o">-</span><span class="nx">t</span><span class="p">[</span><span class="nx">end</span><span class="p">];</span>
<span class="k">if</span><span class="p">(</span><span class="nx">interval</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="kr">print</span> <span class="mi">60000</span><span class="o">/</span><span class="p">(</span><span class="nx">interval</span><span class="o">/</span><span class="nx">size</span><span class="p">),</span> <span class="s2">"BPM"</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">else</span> <span class="p">{</span>
<span class="kr">print</span> <span class="s2">"Too speed"</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="nx">c</span><span class="o">++</span><span class="p">;</span>
<span class="nx">k</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span></code></pre>
<p>et il s'utilise via la ligne :</p>
<pre><code class="sh">xev -event keyboard <span class="p">|</span> ./taptempo.awk</code></pre>
<p>J'utilise le temps mesuré par xev plutôt que la fonction <code>systime()</code> d'awk pour avoir une précision à la miliseconde plutôt qu'à la seconde.</p>
<p>Bonne semaine à tous !</p>
<p>Note: j'utilise <code>xev</code>, je ne connais que lui pour faire ça, mais peut être qu'il y en a d'autres plus pratiques</p><div><a href="https://linuxfr.org/users/dramdur/journaux/taptempo-awk-une-approche-plus-unix.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/113866/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/dramdur/journaux/taptempo-awk-une-approche-plus-unix#comments">ouvrir dans le navigateur</a>
</p>
barmichttps://linuxfr.org/nodes/113866/comments.atomtag:linuxfr.org,2005:Post/388142017-12-20T01:04:00+01:002017-12-20T01:04:00+01:00Créer deux fichiers avec un seul grep<p>J’utilise grep pour filtrer selon un motif et re-diriger le résultat vers un fichier.</p>
<p>Je voudrais qu’un deuxième fichier soit généré, contenant lui les lignes ne correspondant <strong>pas</strong> au motif, le fichier complémentaire en quelque sorte.</p>
<p>Je peux m’en sortir en appelant deux fois grep, ou en utilisant diff, ou d’autres méthodes j’imagine, mais je voudrais savoir s’il y a une méthode plus élégante/concise/efficiente de faire cela. Je vais être honnête : je cherche LA bonne manière de faire pour briller en société. Ne me décevez pas ! ;) </p>
<p>Je ne suis pas bloqué sur grep, j’ai regardé <a href="http://www.theunixschool.com/2012/06/awk-10-examples-to-split-file-into.html">ces exemples avec awk</a> mais je n’ai pas trouvé de réponse qui me convienne, j’ai peut-être lu trop vite cela dit.</p><div><a href="https://linuxfr.org/forums/programmation-shell/posts/creer-deux-fichiers-avec-un-seul-grep.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/113351/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-shell/posts/creer-deux-fichiers-avec-un-seul-grep#comments">ouvrir dans le navigateur</a>
</p>
Marotte ⛧https://linuxfr.org/nodes/113351/comments.atomtag:linuxfr.org,2005:Post/379562017-03-08T09:09:22+01:002017-03-08T09:09:22+01:00Remplacer des cellules<p>Bonjour,</p>
<p>Ce forum m'a bien aidé jusque là dans ma découverte du shell mais là je bloque.<br>
Je suis nouvellement admin réseau et j'ai 2 fichiers .csv que je veux fusionner.</p>
<p><strong>identifiants2015.csv</strong></p>
<blockquote>
<p>$cat identifiants2015.csv<br>
CLASSE,NOM,PRENOM,IDENTIFIANT,M.de P.<br>
c601,A,antoine,antoine.a,4f56yg<br>
c504,B,micheline,micheline.b,654pgh</p>
</blockquote>
<p><strong>identifiants2016.csv</strong></p>
<blockquote>
<p>$cat identifiants2016.csv<br>
CLASSE,NOM,PRENOM,LOGIN,MOT DE PASSE<br>
c601,Z,bob,bob.z,t954fd<br>
c502,A,antoine,antoine.a,(déjà attribué)<br>
c404,B,micheline,micheline.b,(déjà attribué)</p>
</blockquote>
<p>Et je voudrais obtenir ceci en remplaçant "(déjà attribué)" par le mot de passe 2015.<br><strong>logins2016_maj2016.csv</strong></p>
<blockquote>
<p>$cat logins_maj2016.csv <br>
CLASSE,NOM,PRENOM,LOGIN,MOT DE PASSE<br>
c601,Z,bob,bob.z,t954fd<br>
c502,A,antoine,antoine.a,4f56yg<br>
c404,B,micheline,micheline.b,654pgh</p>
</blockquote>
<p>Je me doute qu'il y a quelque chose à faire avec awk mais je n'y arrive pas. La lecture dans les deux fichiers simultanément me pose problème.<br>
Avez-vous une solution pour moi ?<br>
Merci d'avance</p><div><a href="https://linuxfr.org/forums/programmation-shell/posts/remplacer-des-cellules.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/111415/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-shell/posts/remplacer-des-cellules#comments">ouvrir dans le navigateur</a>
</p>
Camhttps://linuxfr.org/nodes/111415/comments.atomtag:linuxfr.org,2005:Post/379292017-02-27T20:01:48+01:002017-02-27T20:01:48+01:00Plomberie unixienne<p>Bonjour,</p>
<p>Je cherche à alimenter une base RRD avec la sortie de la commande <em>vmstat</em> (sous Linux). J’ai créé ma base RRD et je peux l’alimenter manuellement, je n’ai pas de problème de ce côté là.</p>
<p>La commande suivante me sort un enregistrement avec lequel je devrais pouvoir alimenter ma base, toutes les secondes. J’utilise le caractère nul comme séparateur, ce n’est probablement pas une nécessité dans mon cas (donnée RRD…) mais j’ai de toute façon le même comportement en utilisant <code>\n</code>…</p>
<pre><code>vmstat -n 1 | awk '{ if (NR>3) { printf "%s", strftime("%s"); for (i=1; i<18; i++) { printf ":%i", $i; } ; printf "\000"; fflush(); } }'
</code></pre>
<p>Voici ce que sort la commande, en pipant dans <code>cat -v</code> pour qu’on voit le séparateur (<code>^@</code>) :</p>
<pre><code>$ vmstat -n 1 | awk '{ if (NR>3) { printf "%s", strftime("%s"); for (i=1; i<18; i++) { printf ":%i", $i; } ; printf "\000"; fflush(); } }' |cat -v
1488221041:0:0:0:5445776:80776:999008:0:0:0:0:201:210:1:1:98:0:0^@1488221042:0:0:0:5444504:80776:999008:0:0:0:0:2268:4388:3:1:96:1:0^@1488221043:0:0:0:5444504:80776:999008:0:0:0:0:157:156:1:0:99:0:0^@1488221044:0:0:0:5444380:80776:999008:0:0:0:0:223:245:0:1:99:0:0^@1488221045:0:0:0:5444496:80776:999008:0:0:0:0:198:240:1:0:99:0:0^@1488221046:0:0:0:5444504:80780:999008:0:0:0:4:215:225:1:1:98:1:0^@^C
</code></pre>
<p>La commande tourne indéfiniment, ici je l’ai arrêté en faisant Ctrl+C</p>
<p>Je veux maintenant mettre à jour ma base RRD. La commande de mise à jour est la suivante (ici je reprends une des mesures de l’exemple plus haut) :</p>
<pre><code>rrdupdate fichier.rrd '1488221041:0:0:0:5445776:80776:999008:0:0:0:0:201:210:1:1:98:0:0'
</code></pre>
<p>Je m’oriente donc vers l’utilisation de xargs sur la première commande pour exécuter un rrdupdate (ie: rrdtool update) sur chacune des mesures.</p>
<p>Et c’est là que j’ai un problème, c’est comme si xargs ne voyait rien :</p>
<pre><code>$ vmstat -n 1 | awk '{ if (NR>3) { printf "%s", strftime("%s"); for (i=1; i<18; i++) { printf ":%i", $i; } ; printf "\000"; fflush(); } }' |xargs -0
</code></pre>
<p>n’affiche rien. J’ai essayé d’ajouter <code>printf "%s\n"</code> mais c’est pareil…</p>
<p>Pourtant si je prends un exemple plus simple d’utilisation de <em>xargs</em> j’en déduis que ça devrait bien m’afficher les lignes que <em>vmstat</em> me crache :</p>
<pre><code>$ printf "78787\0001421454\00026455\000" |xargs -0 printf "%s\n"
78787
1421454
26455
$ printf "78787\0001421454\00026455\000" |xargs -0
78787 1421454 26455
</code></pre>
<p>Je passe vraisemblablement à côté de quelque chose…</p>
<p>Comment vous y prendriez-vous ?</p><div><a href="https://linuxfr.org/forums/programmation-shell/posts/plomberie-unixienne.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/111354/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-shell/posts/plomberie-unixienne#comments">ouvrir dans le navigateur</a>
</p>
Marotte ⛧https://linuxfr.org/nodes/111354/comments.atomtag:linuxfr.org,2005:Post/367942016-04-28T10:22:18+02:002016-04-28T10:22:18+02:00CSH : Remplacement de mots dans un fichier à partir d'un fichier CSV de correspondance<p>Bonjour,</p>
<p>J'ai un fichier XML évolutif au sein duquel j'aimerais remplacer des noms de ville à partir d'identifiant contenu dans une table de correspondance. pour chaque occurence du fichier.</p>
<p>exemple : table de correspondance</p>
<p>PARIS;75000<br>
BORDEAUX;33000</p>
<p>J'étais parti sur un sed mais j'ai beau creuser je ne trouve pas.</p>
<p>Quelqu'un peut il m'aider SVP.<br>
A votre disposition si vous avez besoin d'informations complémentaires.</p>
<p>J'ai déjà la boucle</p>
<p>while read line<br>
do <br>
var1=$( echo "$line" | sed -n -E 's/.<em>Station="(.</em>)".<em>Value.</em>/\1/ p' )</p>
<pre><code>if [ "$var1" ] ; then
var2=$(echo "$var1" | tr a-z A-Z | cut -c 1-4)
echo -e "`{mathjax} line" | sed -n -E "s/`{var1}/${var2}/ g" >> new_fichier.xml
else
echo -e "$line" >> new_fichier.xml
fi
</code></pre>
<p>done < fichier.xml</p>
<p>Merci beaucoup </p><div><a href="https://linuxfr.org/forums/programmation-shell/posts/csh-remplacement-de-mots-dans-un-fichier-a-partir-d-un-fichier-csv-de-correspondance.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/108848/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-shell/posts/csh-remplacement-de-mots-dans-un-fichier-a-partir-d-un-fichier-csv-de-correspondance#comments">ouvrir dans le navigateur</a>
</p>
lioferhttps://linuxfr.org/nodes/108848/comments.atomtag:linuxfr.org,2005:Diary/360392015-08-14T23:24:38+02:002015-08-14T23:24:38+02:00le dessous des cartesLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li><a href="#quelle-est-la-question">quelle est la question ?</a></li>
<li>
<a href="#obtenir-les-donn%C3%A9es">obtenir les données</a><ul>
<li><a href="#source">source</a></li>
<li><a href="#traitement">traitement</a></li>
<li><a href="#statistiques">statistiques</a></li>
</ul>
</li>
<li>
<a href="#construire-la-carte">construire la carte</a><ul>
<li><a href="#fond-de-carte">fond de carte</a></li>
<li>
<a href="#placer-les-points">placer les points</a><ul>
<li><a href="#projection">projection</a></li>
<li><a href="#zoom-et-centrage">zoom et centrage</a></li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#dessiner">dessiner</a><ul>
<li><a href="#processus">processus</a></li>
<li><a href="#outil">outil</a></li>
</ul>
</li>
<li><a href="#r%C3%A9sultat">résultat</a></li>
</ul><p>Cher journal,</p>
<p>J'aime bien lire sur ce site les histoires de création de carte comme <a href="//linuxfr.org/users/see/journaux/ou-il-est-question-de-d3-des-communes-de-france-et-des-performances-svg-des-moteurs-de-rendu">celle-ci</a> ou <a href="//linuxfr.org/users/nonas/journaux/communes-de-france-finissant-par-ville">celle-là</a>, alors je vais te conter la mienne.</p>
<h2 id="quelle-est-la-question">quelle est la question ?</h2>
<p>Partant d'une question pertinente : "Est-il facile de se ravitailler en GPL en France", j'en suis venu à une question idiote : "Est ce qu'il y a une grande différence des prix du carburant en fonction d'où on habite".</p>
<p>J'imagine une carte de France des points de vente, catégorisés en "bien en dessous de la moyenne" en vert, "dessous de la moyenne" en vert clair, "dans la moyenne" en orange/jaune, "au dessus de la moyenne" en rouge clair, "bien au dessus de la moyenne" en rouge.</p>
<p>Une carte par type de carburant, en utilisant les derniers prix constatés.</p>
<h2 id="obtenir-les-données">obtenir les données</h2>
<h3 id="source">source</h3>
<p>Le site <a href="http://prix-carburants.gouv.fr/">prix des carburants</a> du ministère de l'économie, de l’industrie et du numérique (Oui oui, tout ça), permet de connaître les prix en points de vente (par la suite PdV). Ceux-ci ont obligation de déclarer à l'état les changements de prix.</p>
<p>C'est bien évidement parce que je connais l'existence de ce site que ces questions plus ou moins tordues me sont venues.</p>
<p>La section open data permet de télécharger l'historique de l'ensemble des déclarations des points de ventes.</p>
<h3 id="traitement">traitement</h3>
<p>Les données sont au format XML et plutôt volumineuses. Sur les sept premiers mois de l'année, un peu plus de 2 millions d'enregistrements pour plus de 120MB. J'aurai dû sortir le parseur adéquate genre xml pull parser. Mais le fait qu'il soit bien indenté m'a permis de faire un traitement un peu plus brutal en ligne à ligne avec <a href="http://www.gnu.org/software/gawk/manual/html_node/index.html">awk</a>. Sans plus d'optimisation, les données exploitables sont produites en quelques secondes mais avec un léger embonpoint mémoire d'environ 100MB. Le code, plutôt quick and dirty, est déposé <a href="https://framabin.org/?a254584486ca4812#ItpgnXF+FvSyzQz0xFyknHyxLWjln1NrET3u9ZN7OSM=">ici</a> et invoqué avec <a href="https://framabin.org/?8ae87f05011170ff#H2oBJc5rpSTGJQgPT8yVuWAa0wHv3NSiGhdPz7oZJuw=">cela</a>.</p>
<p>Les données exploitables sont formatées dans des fichiers csv, un par type de carburant, dont les colonnes sont l'identifiant du PdV, les coordonnées latitude/longitude du PdV, le dernier prix déclaré pour ce type de carburant ; une ligne par PdV.<br>
Un fichier de statistiques contient la moyenne et l'écart type pour chaque type de carburant.</p>
<h3 id="statistiques">statistiques</h3>
<p>Comme je ne voyais pas de raison pour qu'il en soit autrement, j'ai supposé que les prix suivaient une distribution en <a href="https://en.wikipedia.org/wiki/Normal_distribution#Standard_deviation_and_tolerance_intervals">Gaussienne</a> et donc que je pouvais procéder à un découpage en intervalles comme proposé par la théorie (μ est la moyenne et σ l'écart type):<br><img src="//img.linuxfr.org/img/68747470733a2f2f6672616d617069632e6f72672f3042376579446c4d4f4e73682f724d7949656a5a74/rMyIejZt" alt="intervals" title="Source : https://framapic.org/0B7eyDlMONsh/rMyIejZt"></p>
<p>Ce qui me fait mes cinq intervalles :</p>
<ol>
<li>x < μ−2σ,</li>
<li>μ−2σ ≤ x < μ−σ,</li>
<li>μ−σ ≤ x ≤ μ+σ,</li>
<li>μ+σ > x ≥ μ+2σ,</li>
<li>x > μ+2σ</li>
</ol><p>Dans les faits, l'hypothèse est à peu près vérifiée.</p>
<h2 id="construire-la-carte">construire la carte</h2>
<h3 id="fond-de-carte">fond de carte</h3>
<p>Wikipedia fournit une grande variété de <a href="https://commons.wikimedia.org/wiki/France#Cartes_.28Maps_.2F_Karten.29">carte de France</a>. Je suis parti de <a href="https://upload.wikimedia.org/wikipedia/commons/6/6e/France_location_map-Regions_and_departements_1975-2014.svg">celui-ci</a>, un peu raboté et converti en PNG:<br><img src="//img.linuxfr.org/img/68747470733a2f2f6672616d617069632e6f72672f5a49466c796b7476575863322f664e365730306a30/fN6W00j0" alt="régions et départements" title="Source : https://framapic.org/ZIFlyktvWXc2/fN6W00j0"></p>
<h3 id="placer-les-points">placer les points</h3>
<p>Les données de base permettent de travailler avec des coordonnées GPS (latitude/longitude) ou avec les communes (code postal). J'ai choisi de travailler avec des coordonnées GPS. Il va donc falloir trouver les emplacements des points d'intérêts sur une carte en pixels.</p>
<h4 id="projection">projection</h4>
<p>La terre étant ronde, pour la représenter sur une carte plate, il faut faire une projection. Et cette projection est toujours imparfaite : si une partie de la carte est correcte, le reste est forcément déformé. A ce titre, le fond de carte présenté sur le Wikimedia Commons est intéressant car on voit que l'échelle varie selon la latitude.<br><img src="//img.linuxfr.org/img/68747470733a2f2f6672616d617069632e6f72672f6156673768523963546a69712f35735a4773653579/5sZGse5y" alt="échelle" title="Source : https://framapic.org/aVg7hR9cTjiq/5sZGse5y"></p>
<p>En effet, pour la France, on utilise la projection <a href="https://fr.wikipedia.org/wiki/Projection_conique_conforme_de_Lambert#Projections_officielles_en_France_m.C3.A9tropolitaine">Lambert-93</a> (avec comme parallèles "standards", CC44 et CC49). Elle a le mérite de ne pas créer de déformation horizontales (le long d'une latitude, d'est en ouest) mais crée des déformations verticales (de long d'une longitude, du nord au sud).</p>
<p>J'ai donc glané sur le web une fonction effectuant la conversion de WGS84 (système GPS) vers Lambert-93. Le code était en php, je l'ai réécrit en awk pour mon usage. Il est déposé <a href="https://framabin.org/?574b8afa3dc8faf8#T99QFVmzqoVyxLuNiT+UPILJmtwVffr8xPR8B3KmumE=">ici</a> pour les curieux. Attention, ça pique un peu. Je conseille de repartir d'une implémentation propre si vous avez ce besoin. L'article wikipedia donne les pointeurs chez l'IGN pour avoir les paramètres et les formules officiels.</p>
<h4 id="zoom-et-centrage">zoom et centrage</h4>
<p>Les coordonnées Lambert-93 représentent une position x,y dans un plan dont l'origine (centrage) et l'échelle (zoom) sont différentes de celles mon fond de carte.<br>
Pour déterminer la transposition que je dois faire, il me faut connaître les coordonnées de trois points dans chaque plan.<br>
Sur le fond de carte, il est ardu de positionner précisément des villes à l'œil nu. J'ai donc choisi de faire correspondre les points les plus au bord.<br>
En utilisant le site <a href="http://epsg.io/2154/map">suivant</a>, j'obtiens:</p>
<pre><code> | lambert | fond de carte
pointe ouest | x= 124754, y=6831715 | X= 0, Y=293
pointe nord | x= 668091, y=7110469 | X=557, Y= 0
pointe est | x=1082912, y=6886783 | X=988, Y=233
pointe sud | x= 714399, y=6148363 | X=608, y=951
</code></pre>
<p>J'utilise les trois premiers pour paramétrer la transposition et le quatrième pour vérifier. Le code en python utilise numpy pour la résolution du système d'équations. Il est disponible <a href="https://framabin.org/?3078b31f5a44886c#YX4Xt+lnn672ZjZN+73FeJQZIxccce0o3x0zbgC4zfY=">ici</a>. La vérification n'est pas très concluante d'ailleurs mais poursuivons.</p>
<h2 id="dessiner">dessiner</h2>
<h3 id="processus">processus</h3>
<p>Je vais dérouler la procédure suivante:</p>
<ul>
<li>constantes : type de carburant, moyenne, écart type, couleurs, couleur de fond</li>
<li>charger les pixels du fond de carte depuis PNG</li>
<li>pour chaque PdV:
<ul>
<li>transposer les coordonnes GPS en pixel dans le plan de la carte</li>
<li>si le pixel est couleur fond (je ne veux pas abîmer les bordures)
<ul>
<li>calculer la couleur, changer la couleur</li>
</ul>
</li>
</ul>
</li>
<li>dumper les pixels vers PNG</li>
</ul><h3 id="outil">outil</h3>
<p>J'ai choisi d'utiliser python et son module <a href="http://pillow.readthedocs.org/">PIL</a>.<br>
Le code, à nouveau quick and dirty, est déposé <a href="https://framabin.org/?fd80b546c9863ed7#IbfBb87expSM+YL58Lup+zWkrMflbAvbGMo7yH/UU8A=">ici</a> pour les curieux.</p>
<h2 id="résultat">résultat</h2>
<p>L'image produite par tout ceci est celle-ci pour le SP95:<br><img src="//img.linuxfr.org/img/68747470733a2f2f6672616d617069632e6f72672f39374a6d37345268377571482f3932496e31506351/92In1PcQ" alt="SP95" title="Source : https://framapic.org/97Jm74Rh7uqH/92In1PcQ"></p>
<p>Première remarque: les points sont un peu trop petits pour que la visualisation se fasse bien. Il y a aussi beaucoup (trop ?) de points jaunes, c'est à dire dans la moyenne.<br>
Ensuite, la projection est clairement fausse ! Les points rouges qui devraient se trouver sur Paris sont légèrement décalés. Plus on descend vers le sud, plus le décalage est important pour finir avec une multitude de points dans l'eau :(<br>
Pour me rassurer, je pense que la projection du fond de carte n'est pas en lambert93, contrairement à ma projection des points d'intérêt; d'où le décalage.</p>
<p>Mais quel était l'intérêt de la manœuvre ?<br>
Partant d'une question plutôt anodine, j'ai du pas mal me triturer le cerveau pour arriver à produire quelque chose. J'imagine que les personnes dont c'est le métier sont mieux outillés et plus expérimenté et peuvent réaliser cette tâche de manière relativement triviale. Cela m'a mis en appétit pour m'intéresser plus longuement à <a href="http://openstreetmap.org/">OSM</a> et aux logiciels de <a href="https://en.wikipedia.org/wiki/Geographic_information_system">GIS</a>. Sûrement pour le prochain épisode !</p><div><a href="https://linuxfr.org/users/steph1978/journaux/le-dessous-des-cartes.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/106499/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/steph1978/journaux/le-dessous-des-cartes#comments">ouvrir dans le navigateur</a>
</p>
steph1978https://linuxfr.org/nodes/106499/comments.atom