<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>manipolare &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/manipolare/</link>
	<description>Feed of posts on WordPress.com tagged "manipolare"</description>
	<pubDate>Sun, 29 Nov 2009 10:38:23 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Transparency International nu manipulează, Victor Alistar da ]]></title>
<link>http://blue2403.wordpress.com/2009/11/18/transparency-international-nu-manipuleaza-victor-alistar-da/</link>
<pubDate>Wed, 18 Nov 2009 11:28:10 +0000</pubDate>
<dc:creator>blue2403</dc:creator>
<guid>http://blue2403.wordpress.com/2009/11/18/transparency-international-nu-manipuleaza-victor-alistar-da/</guid>
<description><![CDATA[Transparency International. Sună mişto, îţi vine în cap lenjeria cineştie cărei gagici care face fur]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-align:center;"><span style="color:#000080;"><a href="http://blue2403.wordpress.com/files/2009/11/transparency-international-pcs1.jpg"><img class="aligncenter size-full wp-image-326" title="Transparency International pcs" src="http://blue2403.wordpress.com/files/2009/11/transparency-international-pcs1.jpg" alt="" width="287" height="533" /></a><br />
</span></p>
<p><span style="color:#000080;">Transparency International.</span></p>
<p><span style="color:#000080;">Sună mişto, îţi vine în cap lenjeria cineştie cărei gagici care face furori în Playboy.</span></p>
<p><span style="color:#000080;">Dar nu e vorba de asta ci de o organizaţie şmeceră care măsoară diferite lucruri. Acum cică au măsurat Corupţia.</span></p>
<p><span style="color:#000080;">Concluzia lor e că România are 3,8 puncte, la fel ca în anul precedent.</span></p>
<p><span style="color:#000080;">Mai întâi ni se spune că suntem pe ultimul loc din Europa pentru că avem 3,8 puncte.</span></p>
<p><span style="color:#000080;">Apoi că de fapt avem acelaşi punctaj cu Grecia şi Bulgaria, da’ tot suntem pe ultimul loc deoarece Bulgaria e în creştere şi că ne-a ajuns datorită unei creşteri de 0,2 punte,  iar   Grecia în scădere cu 0,9 puncte.</span></p>
<p><span style="color:#000080;">Deci la egalitate cu cele două ţări, da’ tot noi suntem ultimii. Că aşa vrea Victor Alistar.<br />
</span></p>
<p><span style="color:#000080;">Privind atent la tv ca să văd despre ce e vorba, aflu de la o domnişoară drăguţă că de fapt ei au măsurat percepţia asupra corupţiei şi nu situaţia adevărată. „Ar fi prea greu”, conchide respectiva.</span></p>
<p><span style="color:#000080;">Apoi l-am văzut pe Victor Alistar făcând un fel de acrobaţii logice.</span></p>
<p><span style="color:#000080;">Zicea omul că acum suntem în cea mai  proastă poziţie de când ştiu muşchiu’ lui.</span></p>
<p><span style="color:#000080;">E drept că avem cel mai bun punctaj pe care l-am avut de când ştie el dar cu toate aste e cel mai rău, pentru că n-a mai crescut. A rămas acolo înţepenit chiar dacă trecem printr-o criză cum n-a mai fost în perioada de când muşchiul lui Alistar mănâncă degeaba banii lu’ Transparency Internaţional.</span></p>
<p><span style="color:#000080;">Zicea omul (?) că înainte (în perioada 2004-2008) era mai bine că aveam un plan deci punctajul ne creştea acum nu mai avem, deci stagnăm.</span></p>
<p><span style="color:#000080;">Foarte interesant. Ca din întâmplare e perioada când era Tăriceanu Premier. De exemplu poveştile cu caltaboşi şi pălincă erau percepute ca filme SF.</span></p>
<p><span style="color:#000080;">Eu stau şi tot aştept să-l văd pe Victoraş răspunzând acuzaţiilor ANI.</span></p>
<p><span style="color:#000080;"> </span></p>
<p><span style="color:#000080;">http://stiri.juridice.ro/40871/ani-il-ataca-pe-victor-alistar.html</span></p>
<p><span style="color:#000080;"> </span></p>
<p><span style="color:#000080;">http://www.hotnews.ro/stiri-esential-5841506-ani-acuza-victor-alistar-fals-legatura-declaratia-avere-transparency-international-ani-ataca-alistar-dupa-transparency-sesizat-problemele-integritate-nivelul-conducerii-ani.htm</span></p>
<p><span style="color:#000080;"> </span></p>
<p><span style="color:#000080;">De asemenea, i-aş aminti zglobiului personaj, că în perioada în care magistraţii făceau greva aceea ilegală el era unul din personajele extrem de vocale şi susţinea că judecătorii săracii au venituri atât de mici încât nu îşi pot cumpăra o casă şi o maşină decente. Nu îl interesa că aceiaşi colegi asi lui îngroapă dosare de corupţie precum groparii cadavrele celor morţi la vreme de ciumă.</span></p>
<p><span style="color:#000080;">Ba şi mai mult, nu văd nici o referire a respectivei organizaţii vreo referire la sondajele oferite pe piaţă cu generozitate de diferite organizaţii de sondare a opiniei publice, sondaje care seamănă între ele precum copii a două copluri, unul formatdintr-un pigmeu, cu o suedeză şi altul, dintr-o negresă cu  un chinez.</span></p>
<p><span style="color:#000080;">Poate ar fi bine să se aplece puţin şi asupra mecanismelor care au făcut ca un urma unor decizii ale PSD-ului să intre în grevă diferite organizaţii sindicale, sau de ce nu să măsoare transparenţa afacerilor domnului Patriciu şi legăturilor unor indivizi precum Sorin Roşca-Stănescu cu acestea.</span></p>
<p><span style="color:#000080;">Parcă tot era mai mişto dacă Transparency International era un nume de lenjerie damă &#8230;</span></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[gawk: semplice e potente linguaggio per processare dati testuali]]></title>
<link>http://natonelbronx.wordpress.com/2009/07/20/gawk-semplice-e-potente-linguaggio-per-processare-dati-testuali/</link>
<pubDate>Mon, 20 Jul 2009 21:13:00 +0000</pubDate>
<dc:creator>mastro</dc:creator>
<guid>http://natonelbronx.wordpress.com/2009/07/20/gawk-semplice-e-potente-linguaggio-per-processare-dati-testuali/</guid>
<description><![CDATA[(rieccomi dopo mesi di nulla.. a casa malato e mi do da fare ) Quest&#8217;articolo fa parte di una ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>(rieccomi dopo mesi di nulla.. a casa malato e mi do da fare <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  )</p>
<p>Quest&#8217;articolo fa parte di <a href="http://natonelbronx.wordpress.com/2007/12/02/manipolare-un-testo-con-sed-awk-e-le-espressioni-regolari/">una serie di articoli</a> sui tool GNU (e quindi Linux) per manipolare testi.</p>
<p>L&#8217;esempio che si era visto in quell&#8217;articolo, con awk, è il seguente:<br />
<code>cat sottotitoli.srt &#124; awk 'NR%2==1' &#62; sottotitoli-dispari.srt</code></p>
<p>il cui scopo era rimuovere tutte le righe pari&#8230; fra poco sarà tutto più chiaro!</p>
<p><strong><em>awk</em></strong> è un altro software per la manipolazione dei testi, secondo il mio parere si adatta meglio a lavorare su testi con una struttura rigida, ad esempio divisi per colonne (tipo tabella), ogni elemento di questa &#8220;tabella&#8221; è chiamato &#8216;campo&#8217;. Per elaborare il risultato di molti comandi Linux questo strumento è comodissimo <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Per comprendere cosa intendo ecco un piccolo esempio che potete replicare facilmente aprendo un terminale:</p>
<blockquote><p><strong><code>$ cal</code></strong><br />
luglio 2009<br />
lu ma me gi ve sa do<br />
1  2  3  4  5<br />
6  7  8  9 10 11 12<br />
13 14 15 16 17 18 19<br />
20 21 22 23 24 25 26<br />
27 28 29 30 31</p></blockquote>
<p>Il comando <strong><em>cal</em></strong> senza parametri stampa il calendario del mese corrente (Luglio 2009 in questo caso).<br />
Vediamo cosa succede se diamo in pasto il risultato del comando cal ad awk.</p>
<blockquote><p><strong><code>$ cal &#124; awk '{ print $3; }'</code></strong><br />
me<br />
3<br />
8<br />
15<br />
22<br />
29</p></blockquote>
<p>Quel che ho fatto qui è semplicissimo: eseguo il comando <strong><em>cal</em></strong>, quindi il risultato lo butto in pasto al comando <strong><em>awk</em></strong> (si ottiene grazie al pipe, ovvero la linea verticale &#8216;&#124;&#8217;).<br />
il &#8220;programma&#8221; che viene fatto girare da awk è semplicemente: <code>{ print $3; }</code>. Ovvero: stampa la terza colonna (Mercoledì).</p>
<p>In realtà awk è un vero linguaggio di programmazione e quindi più potente, per certi versi, di sed: contiene funzioni richiamabili e permette di effettuare operazioni matematiche con i dati in elaborazione!</p>
<p>In questo breve tutorial impareremo il significato del comando visto qui sopra e cercherò di insegnarvi ad utilizzare awk in modo più approfondito: applicando pattern &#8220;per riga&#8221; ed effettuando operazioni su stringhe e numeri!</p>
<h2>Prerequisiti</h2>
<p>Per poter comprendere appieno questo tutorial è necessario che abbiate compreso e fatto un po&#8217; di pratica con le regular expression (o regex) di cui vi ho parlato <a href="http://natonelbronx.wordpress.com/2007/12/02/le-espressioni-regolari-regex-o-regexp/">qui</a>.<br />
Non sono richieste particolari esperienze di programmazione ma aiutano parecchio.</p>
<h2>il software si chiama gawk</h2>
<p>Si.. non <em>awk</em> ma <em><strong>g</strong>awk</em>! awk è il linguaggio, <em>gawk</em> è l&#8217;implementazione <strong>GNU</strong> del linguaggio!<br />
Cioè { print $3; } è un comando nel linguaggio awk che dice di stampare la terza colonna, mentre il software che esegue codice awk si chiama gawk in sistemi GNU/* come Linux.</p>
<h2>lanciare gawk</h2>
<p>Il manuale di gawk è molto ben scritto, anche se in inglese, e io ho imparato ad utilizzare awk semplicemente leggendo questo manuale e provando di volta in volta.</p>
<blockquote><p><strong><code>man gawk</code></strong></p></blockquote>
<p>le opzioni principali per lanciare gawk (per le altre guardate il manuale):</p>
<ul>
<li><code>-F fs</code> o <code>--field-separator fs</code> «  l&#8217;opzione del comando awk vi permette di specificare quali sono i caratteri che volete siano considerati come separatori di campo (se omessa verranno usati gli spazi e le tabulazioni) e indovinate un po? si può, volendo, indicare quali sono i separatori di campo con una espressione regolare (<a href="http://natonelbronx.wordpress.com/2007/12/02/le-espressioni-regolari-regex-o-regexp/">regex</a>)</li>
<li><code>-f script-file</code> o <code>--file script-file</code> « specifica un file di script awk invece che indicarlo dalla linea di comando tra apici</li>
</ul>
<p>awk si lancia con questa sintassi (notate gli apici prima e dopo i comandi):</p>
<blockquote><p><code>awk  '&#60;programma&#62;' nome-file-su-cui-lavorare</code></p>
<p><em>oppure</em></p>
<p><code>cat nome-file-su-cui-lavorare &#124;  awk  '&#60;programma&#62;'</code></p>
<p><em>oppure</em></p>
<p><code>awk -f programma-awk.awk nome-file-su-cui-lavorare</code></p></blockquote>
<p>Se ad esempio vogliamo chiedere ad awk di usare la virgola come carattere di separazione dei campi (Field Separator, FS) possiamo invocare awk così:</p>
<blockquote><p><code>awk -F, '&#60;programma&#62;'</code></p></blockquote>
<p>esiste un caso particolare in cui questo non funziona: se cercate di impostare il SOLO carattere tabulazione (che si indica con &#8216;\t&#8217;) come FS non riuscirete a scriverlo in questo modo&#8230; dovrete usare questa scrittura:</p>
<blockquote><p><code>awk -F "\t" '&#60;programma&#62;'</code></p></blockquote>
<p>che poteva comunque essere utilizzata anche per la virgola o per passare una regex ad awk</p>
<p>un altro modo per fare la stessa cosa è impostare la variabile FS all&#8217;interno del programma così:</p>
<blockquote><p><code>awk 'BEGIN {FS = ","} { ... }'</code></p></blockquote>
<p>Questo metodo è più comodo se volete scrivere uno script invece che lanciare da linea di comando&#8230;</p>
<p>Inoltre con l&#8217;esempio vediamo 2 cose nuove: BEGIN e l&#8217;utilizzo di variabili (cioè contenitori di dati che possono cambiare durante l&#8217;esecuzione del codice).</p>
<p>Per chiarificare immaginate di avere questa riga di testo: &#8220;tizio,caio,sempronio&#8221; e di voler effettuare una separazione utilizzando la virgola anziché gli spazi&#8230; Otterreste quindi i campi &#8220;tizio&#8221;, &#8220;caio&#8221; e &#8220;sempronio&#8221;.</p>
<blockquote><p><strong><code>$ echo 'tizio,caio,sempronio' &#124; gawk -F, '{ print "1=" $1 " - 2=" $2 " - 3=" $3; }'</code></strong><br />
1=tizio &#8211; 2=caio &#8211; 3=sempronio</p></blockquote>
<p>Con quest&#8217;esempio abbiamo anche visto come concatenare delle stringhe (del testo): quello che vuoi volete scrivere potete metterlo tra virgolette doppie&#8230; per concatenare più stringhe (metterle una dopo l&#8217;altra) è sufficiente elencarle separate da spazio!</p>
<h2>Struttura di base di un programma awk</h2>
<p>Il testo è suddiviso in record e campi: possiamo pensare ai record come le &#8220;righe&#8221; di un file di testo e ai &#8220;campi&#8221; come le sue &#8220;colonne&#8221;.<br />
Come abbiamo visto prima nell&#8217;esempio del calendario i campi sono separati automaticamente dove ci sono spazi, i record sono separati con degli &#8220;a capo&#8221;. Entrambe questi limitatori si possono cambiare modificando le variabil FS (Field separator, separatore di campo) e RS (Record Separator, separatore di record).</p>
<p>gawk legge un record alla volta, lo suddivide in campi e vi permette di lavorarci.</p>
<p>La struttura di un programma awk è la seguente:</p>
<blockquote><p><code>pattern1 { azioni }<br />
pattern2 { azioni }<br />
<em>function</em> nome(parametri) { azioni }<br />
</code></p></blockquote>
<p>I pattern selezionano dei record su cui verranno svolte delle azioni.<br />
Le funzioni sono comode quando dobbiamo ripetere le stesse operazioni più volte nelle nostre azioni.</p>
<p>Ora vedremo come si utilizzano le variabili in un programma awk, quindi cosa sono i pattern e come sfruttarli&#8230;<br />
Il tutto verrà supportato da esempi!</p>
<h2>Variabili</h2>
<p>Come in qualunque linguaggio di programmazione una variabile è un etichetta: un contenitore!<br />
Le variabili gawk possono contenere numeri o testo e awk si occupa automaticamente di convertire dall&#8217;uno all&#8217;altro all&#8217;occorrenza.</p>
<p>Dichiarare una variabile è semplice:</p>
<blockquote><p><code>numero = 12;<br />
testoNumero = "4";<br />
saluto = "ciao";<br />
nome = "daniele";<br />
concatenamento = testo " " nome; <em>/* ciao daniele */</em><br />
risultato = numero / testoNumero; <em>/* 3 */</em></code></p></blockquote>
<p>Le variabili, una volta che assumono un valore, sono utilizzabili ovunque nel programma awk: sono &#8220;globali&#8221;.</p>
<p>Ci sono alcune variabili &#8220;speciali&#8221; già definite da awk, ed alcune le abbiamo già usate:</p>
<ul>
<li>$1: primo campo del record</li>
<li>$2: secondo campo del record</li>
<li>$0: l&#8217;intero record</li>
<li>NF: (Number of Fields) numero di campi ($1, $2, &#8230;)</li>
<li>FS: (Field Separator) separatore di campo, può essere modificato durante l&#8217;esecuzione e cambia i valori delle variabili $1, $2, $3, &#8230;</li>
<li>NR: (Number of Records) numero di record processati (per semplicità pensatelo come il numero di riga per ora)</li>
<li>FNR: Numero del record corrente nel file (questo è effettivamente il numero di riga/record)</li>
<li>RS: (Record Separator) carattere separatore tra record (predefinito è l&#8217;a-capo)</li>
</ul>
<p>Le trovate tutte nel manuale di gawk.</p>
<p>Vediamo alcuni esempi:</p>
<blockquote><p>conta il numero di righe di un file di testo. (stesso risultato del comando <code>wc -l</code> di Linux):</p>
<p><strong><code>gawk '{numeroRighe = numeroRighe +1;} END { print numeroRighe; }'</code></strong></p>
<p>inserisce i numeri di riga di un file (1. prima riga, 2. seconda riga, ecc&#8230;):</p>
<p><strong><code>gawk '{ print FNR ". " $0;}'</code></strong></p></blockquote>
<p>Supponente poi di avere una file con una lista &#8220;nome: numero&#8221;:</p>
<blockquote><p>primo salto: 170<br />
secondo salto: 175<br />
terzo salto: 180</p></blockquote>
<p>si può facilmente calcolare e stampare una media con awk:</p>
<blockquote><p><code>BEGIN {<br />
FS = ":"; <em>/* imposto come separatore i 2 punti */</em><br />
}<br />
{<br />
conteggioRighe = conteggioRighe +1; <em>/* questo può anche essere scritto conteggioRighe++; */</em><br />
totale = totale + $2; <em>/* il secondo campo è quello dopo i due punti */</em><br />
print $0; <em>/* stampo tutta la riga invariata */</em><br />
}<br />
END {<br />
print "-----------"; <em>/* un separatore */</em><br />
print "media: " totale/conteggioRighe;<br />
}</code></p></blockquote>
<h3>vettori</h3>
<p>tra le variabili si possono anche definire vettori!</p>
<blockquote><p><code>mioArray[indice] = valore;<br />
print mioArray[indice];</code></p></blockquote>
<p>l&#8217;indice e il valore possono essere qualunque variabile: un numero o una stringa.<br />
Quindi questo è perfettamente legale:</p>
<blockquote><p><code>mioArray["febbre"] = 38;<br />
mioArray["vomito"] = "si purtroppo";<br />
mioArray[1] = "tutto chiaro?";</code></p></blockquote>
<h2>pattern di riga</h2>
<p>Vi siete chiesti il perché delle parentesi graffe? O perché BEGIN è stato scritto di fronte ad esse nell&#8217;ultimo esempio? Qui viene spiegato il perché.</p>
<p>Il linguaggio awk va definito in questo modo:</p>
<blockquote><p><code>BEGIN { comandi da eseguire all'inizio }<br />
PATTERN1 { comandi da eseguire per le righe che corrispondono al pattern 1 }<br />
PATTERN2 { comandi da eseguire per le righe che corrispondono al pattern 2 }<br />
END { comandi da eseguire alla fine}</code></p></blockquote>
<h3>Si ma cos&#8217;è un pattern?</h3>
<p>Il pattern è in sostanza qualcosa che dice ad awk su quali parti del testo lavorare!<br />
Il pattern può essere un espressione regolare, una espressione di una qualche relazione o una combinazione di queste cose!</p>
<p>Ad ogni pattern sono associate una o più azioni che vengono racchiuse tra parentesi graffe &#8216;{ }&#8217;. Se l&#8217;azione viene omessa questa corrisponde all&#8217;azione &#8216;{print}&#8217; che semplicemente stampa l&#8217;intero pattern senza azioni su di esso!</p>
<p>Quindi un pattern può essere:</p>
<ul>
<li>una regex: <strong>/regex/</strong> { fai qualcosa per le righe che soddisfano la regular expression }</li>
<li>un confronto <strong>NR%2 == 1</strong> { fai qualcosa con i numeri di riga dispari }: NR è la variabile &#8220;numero di riga&#8221;, <strong>NR%2</strong> è il <strong>modulo 2</strong>, cioè il resto della divisione per 2.</li>
</ul>
<p>più pattern possono essere messi in OR/AND/NOT. Cioè ad esempio si può dire che si vuole effettuare un particolare comando per le righe pari che cominciano con dei numeri mettendo in AND un confronto (righe pari) e una regolar expression (cominciano con un numero):</p>
<blockquote><p><code>NR%2==0 <strong>&#38;&#38;</strong> /^[0-9].*/ { comandi da applicare a righe pari che cominciano con un numero }</code></p>
<p><code><strong>!</strong> /topo/ { fai qualcosa con le righe che <strong>NON</strong> contengono la parola "topo" }</code></p></blockquote>
<p>Ci sono due pattern speciali: BEGIN e END. Questi pattern ignorano i dati d&#8217;ingresso (il testo).<br />
Con BEGIN la parte &#8220;azione&#8221; viene eseguita tutta PRIMA di leggere un qualsiasi input.<br />
Con END la parte &#8220;azione&#8221; viene eseguita DOPO aver finito di processare l&#8217;intero testo in input.</p>
<p>Nell&#8217;esempio con il file dei sottotitoli abbiamo utilizzato solamente il pattern indicando che volevamo awk lavorasse solo sulle righe dispari.</p>
<h2>le funzioni</h2>
<p>gawk vi mette a disposizione diverse funzioni già pronte, qui ve ne elenco qualcuna ma vi rimando al manuale di gawk per una lista completa.</p>
<ul>
<li><strong>print(<em>stringa</em>)</strong>: l&#8217;abbiamo già vista, stampa a video delle stringhe</li>
<li><strong>lenght(<em>stringa</em>)</strong>: restituisce la lunghezza di una stringa</li>
<li><strong>tolower(<em>stringa</em>)</strong>: restituisce la stringa in caratteri minuscoli</li>
<li><strong>toupper(<em>stringa</em>)</strong>: restituisce la stringa in caratteri maiuscoli</li>
<li><strong>int(<em>numero</em>)</strong>: restituisce l&#8217;intero del numero (toglie i decimali)</li>
<li><strong>cos(<em>numero</em>)</strong>: calcola il coseno di un numero</li>
<li><strong>sqrt(<em>numero</em>)</strong>: calcola la radice quadrata di un numero</li>
<li><strong>system(<em>stringa di comando</em>)</strong>: esegue un comando Linux</li>
</ul>
<p>supponiamo di voler rendere più evidenti tutte le righe di un testo con la scritta &#8220;important&#8221; all&#8217;interno.<br />
Solo le righe che contentono la parola &#8220;important&#8221; sono state convertite in TUTTO MAIUSCOLE, le altre sono state stampate così come sono (notare il ! di NOT davanti alla seconda regex):</p>
<blockquote><p><code>awk '/important/ { print toupper($0);} !/important/ { print $0; }'</code></p></blockquote>
<p>nuove funzioni possono essere definite anche da voi seguendo la sintassi, vediamo una modifica del comando precedente:</p>
<blockquote><p><code>awk '/important/ { print maiuscolo($0);} !/important/ { print $0; } function maiuscolo(stringa) { return toupper(stringa); }'</code></p></blockquote>
<h2>Cicli e condizionali</h2>
<p>Come tutti i linguaggi di programmazione anche awk mette a disposizione dei comandi per gestire il flusso di operazioni!</p>
<ul>
<li><strong>if (</strong><em>condizione</em><strong>) {</strong> <em>azione</em> <strong>} else {</strong> <em>altra azione</em> <strong>}</strong></li>
<li><strong>while (</strong><em>condizione</em><strong>) {</strong> <em>azione da ripetere</em> <strong>}</strong></li>
<li><strong>for (</strong><em>inizializzazione</em><strong>;</strong> <em>condizione</em><strong>;</strong> <em>avanzamento</em><strong>) {</strong> <em>azione da ripetere</em> <strong>}</strong></li>
<li><strong>for (</strong><em>indice</em> <strong>in</strong> <em>array</em><strong>) {</strong> <em>azioni con gli elementi di un array</em> <strong>}</strong></li>
</ul>
<p>Per chi ha famigliarità con un linguaggio di programmazione non serve aggiungere altro a questa lista, per gli altri non sarà così ovvia&#8230;<br />
Mi limiterò a fare qualche esempio per lasciar &#8220;intuire&#8221; come utilizzarli ma non è presunzione di questo tutorial insegnare a programmare a chi non lo ha mai fatto:</p>
<p>Riprendiamo l&#8217;esempio con i salti di prima (notate in fondo il comando if):</p>
<blockquote><p><code><br />
BEGIN {<br />
FS = ":"; <em>/* imposto come separatore i 2 punti */</em><br />
}<br />
{<br />
conteggioRighe = conteggioRighe +1; <em>/* questo può anche essere scritto conteggioRighe++; */</em><br />
totale = totale + $2; /* il secondo campo è quello dopo i due punti */<br />
print $0; /* stampo tutta la riga invariata */<br />
}<br />
END {<br />
print "-----------"; <em>/* un separatore */</em><br />
calcoloMedia = totale/conteggioRighe;<br />
<strong>if (calcoloMedia &#60; 120) { print "media: CHE SCHIAPPA!!!"; }<br />
else { print "media: " totale/conteggioRighe; }</strong><br />
}</code></p></blockquote>
<p>Stavolta se la media di altezza per il salto in alto è inferiore a 120 verrà stampato <em>CHE SCHIAPPA!!!</em> <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Come altro esempio immaginate di avere questo file:</p>
<blockquote><p>salto in alto: 190<br />
salto in alto: 174<br />
salto in lungo: 5.3<br />
100 metri: 9.5<br />
salto in lungo: 4.8<br />
salto in alto: 193<br />
100 metri: 10.2</p></blockquote>
<p>Ora vedremo, come ultimo esempio, come calcolare le medie di tutte le varie discipline in un colpo solo:</p>
<blockquote><p><code><br />
BEGIN {<br />
FS = ":"; <em>/* imposto come separatore i 2 punti */</em><br />
}<br />
{<br />
<strong>conteggioRighe[$1]++;</strong><br />
<strong>totale[$1] = totale[$1] + $2;</strong> <em>/* l'indice è il nome della disciplina ($1), il valore il risultato ($2) */</em><br />
print $0; <em>/* stampo tutta la riga invariata */</em><br />
}<br />
END {<br />
print "-----------"; <em>/* un separatore */</em><br />
print "MEDIE:";<br />
<em>/* per ogni indice dell'array stampa una media */</em><br />
<strong>for (indice in totale) { print indice ": " totale[indice]/conteggioRighe[indice]; }</strong><br />
}</code></p></blockquote>
<p>ecco quello che si ottiene eseguendo questo programmino:</p>
<blockquote><p><strong><code>$ awk -f programmino.awk attletica.txt </code></strong><br />
salto in alto: 190<br />
salto in alto: 174<br />
salto in lungo: 5.3<br />
100 metri: 9.5<br />
salto in lungo: 4.8<br />
salto in alto: 193<br />
100 metri: 10.2<br />
&#8212;&#8212;&#8212;&#8211;<br />
MEDIE:<br />
salto in alto: 185.667<br />
100 metri: 9.85<br />
salto in lungo: 5.05</p></blockquote>
<p>sono disponibile per domande <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
se vi sembra ci siano parti poco chiare fatemelo notare e farò del mio meglio per renderle più chiare</p>
<p>ps: scusate ho fatto casini con il copia incolla.. ora dovrebbe essere a posto</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Momenti di Gloria... ma non ditelo ai miei ignari antagonisti!]]></title>
<link>http://dailygodot.wordpress.com/2008/12/03/momenti-di-gloria-ma-non-ditelo-ai-miei-ignari-antagonisti/</link>
<pubDate>Wed, 03 Dec 2008 12:18:09 +0000</pubDate>
<dc:creator>Godot</dc:creator>
<guid>http://dailygodot.wordpress.com/2008/12/03/momenti-di-gloria-ma-non-ditelo-ai-miei-ignari-antagonisti/</guid>
<description><![CDATA[Eravamo rimasti alla mia infanzia&#8230; ma prima di proseguire con questa lagna maliconica&#8230; f]]></description>
<content:encoded><![CDATA[Eravamo rimasti alla mia infanzia&#8230; ma prima di proseguire con questa lagna maliconica&#8230; f]]></content:encoded>
</item>
<item>
<title><![CDATA[sed: programma per manipolare e filtrare flussi di testi!]]></title>
<link>http://natonelbronx.wordpress.com/2007/12/02/sed-programma-per-manipolare-e-filtrare-flussi-di-testi/</link>
<pubDate>Sun, 02 Dec 2007 18:08:52 +0000</pubDate>
<dc:creator>mastro</dc:creator>
<guid>http://natonelbronx.wordpress.com/2007/12/02/sed-programma-per-manipolare-e-filtrare-flussi-di-testi/</guid>
<description><![CDATA[Il comando &#8217;sed&#8217; permette di manipolare, filtrare, trasformare testi o flussi di testi; ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Il comando &#8217;sed&#8217; permette di manipolare, filtrare, trasformare testi o flussi di testi; con flussi di testi intendo che può lavorare anche su dati che gli arrivano un po&#8217; per volta. In modo predefinito elabora i file di testo riga per riga.</p>
<p>sed è tipico degli ambienti GNU/Linux e Unix in generale. Prerequisito di questa guida è la conoscienza almeno basilare delle espressioni regolari, se ancora non lo avete letto o non le conoscete leggetevi prima <a href="http://natonelbronx.wordpress.com/2007/12/02/le-espressioni-regolari-regex-o-regexp/" title="Introduzione alle espressioni regolari">questo articolo</a>.  Un esempio semplice di utilizzo di sed lo trovate invece <a href="http://natonelbronx.wordpress.com/2007/12/02/manipolare-un-testo-con-sed-awk-e-le-espressioni-regolari/" title="Esempio di modifica di un file dei sottotitoli">qui</a>.</p>
<p>Questa introduzione è abbastanza completa ma non tratta ancora tutto perché le mie conoscenze di sed non sono ancora a livelli &#8220;guru&#8221; <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Aggiornerò la guida quando avrò più conoscenze di sed! Potete comunque trovare già moltissime spiegazioni ed esempi adesso.</p>
<p>&#124;&#124; Versione guida: 1.1 &#124;&#124;</p>
<p>############</p>
<p>** in preparazione: script con sed, molto più potenti del semplice utilizzo a linea di comando **</p>
<p>10/12/2007 &#8211; v. 1.1</p>
<ul>
<li>aggiunto il comando &#8220;transliterate&#8221;, per sostituire certi caratteri con altri, ai comandi spiegati ( y/prima/dopo/ )</li>
</ul>
<p>############</p>
<p><!--more--><br />
le opzioni principali (per le altre guardate il manuale):</p>
<ul>
<li><code>-n</code> o <code>--quiet</code> o <code>--silent</code> « inibisce la stampa di ciò che viene fatto (vedere gli esempi)<code></code></li>
<li><code>-e script</code> o <code>--expression[=script</code> « specifica uno script tra gli apici (opzione già vista) direttamente sulla linea di comando. Più comandi vanno separati da un punto e virgola ';'</li>
<li><code>-i[SUFFISSO] </code>o <code>--in-place[=SUFFISSO]</code> « richiede di modificare direttamente il file, se viene specificato un suffisso viene creato un file di backup. consiglio di porre attenzione quando utilizzate questa opzione<br />
es.<br />
<code>sed -i</code> # modifica senza creare un backup<br />
<code>sed --in-place</code> # come sopra<br />
<code>sed -i.bak</code> # creerà una copia del file aggiungendo alla fine .bak<br />
<code>sed --in-place=.bak</code> # stesso di sopra</li>
<li><code>-f script-file</code> o <code>--file=script-file</code> « specifica un file di script</li>
</ul>
<p>queste sono le opzioni del comando, ben poca cosa! Quel che più serve sono i comandi degli script! Io ve ne mostrerò solo alcuni, i pochi già utilizzati e poco altro, come al solito per tutti i comandi consultate il manuale (man sed)</p>
<p>In genere i comandi si distinguono in due gruppi: quelli che selezionano delle righe su cui lavorare e quelli che eseguono qualche operazione. Sed vuole che prima si selezionino le righe su cui lavorare e quindi gli si dica come lavorare su di esse! Se non viene specificato su quali righe lavorare sed opererà su tutte.</p>
<ul>
<li><code>p</code> « stampa ciò che stà elaborando, per comprendere il comando provate questi:<br />
<code>sed -e '' vostro-file.txt</code> <i># non fa nulla (ma stampa tutto il file)</i><br />
<code>sed -n -e '' vostro-file.txt</code> <i># non fa nulla e non stampa nulla (opzione -n)</i><br />
<code>sed -e 'p' vostro-file.txt</code> <i># stampa il file (ogni riga due volte come vedrete)</i><br />
<code>sed -n -e 'p' vostro-file.txt</code> <i># stampa il file una sola volta</i><br />
ora dovreste comprendere il significato dell&#8217;opzione -n, il modo migliore per capirlo è provare ad eseguire i comandi con e senza quest&#8217;opzione</li>
<li><code>p</code> « stampa la riga (print)</li>
<li><code>/regex/p</code> « elabora e stampa le sole righe corrispondenti alla regex</li>
<li><code>d</code> « elimina la riga (usarlo senza l&#8217;opzione -n) &#8211; (delete)</li>
<li><code>/regex/d</code> « elimina le righe che corrispondono alla regex</li>
<li><code>s/regex/sostituto/</code> « come già visto sostituisce il testo individuato dalla regex con quello che gli viene indicato; lo fà però solo la prima volta che lo incontra per ogni riga<br />
dove ho scritto &#8220;sostituto&#8221; potete fare in modo che venga inserita l&#8217;espressione trovata tramite la regex utilizzando la e-commerciale (&#38;) (substitute)</li>
<li><code>g</code> « &#8220;mantiene&#8221; la riga corrente, scusate se non spiego meglio ma non ho ancora usato abbastanza questo comando da capirlo a fondo <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </li>
<li><code>s/regex/sostituto/g</code> « come sopra ma non si ferma al primo testo individuato</li>
<li>y/prima/dopo/ « questo sostituisce i caratteri &#8220;prima&#8221; con i corrispondenti &#8220;dopo&#8221;<br />
es.:<br />
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ « trasforma tutti i caratteri minuscoli in caratteri maiuscoli. Il primo carattere nella prima parte (a) diventa il primo nella seconda (A)</li>
<li><code>4</code> « corrisponde alla quarta riga</li>
<li><code>3p</code> « stampa la terza riga (usatelo con l&#8217;opzione -n altrimenti la terza riga verrà stampata due volte e il resto una sola volta)</li>
<li><code><i>inizio</i>,<i>fine</i></code> « corrisponde a tutte le righe da &#8216;inizio&#8217; a &#8216;fine&#8217; (comprese)<br />
es.<br />
<code>1,5d</code> « le prime cinque righe vengono eliminate<br />
<code>4,12p</code> « le righe dalla 4 alla 12 vengono stampate</li>
<li><code><i>prima</i>~<i>passo</i></code> « corrisponde a tutte le righe a partire dalla riga &#8216;prima&#8217; e da quella ogni &#8216;passo&#8217; righe, và usato assieme ad un comando<br />
es.<br />
<code>1~2p</code> « stampa tutte le righe dispari (parte dalla prima e poi ogni 2). Stesso risultato di quello che abbiamo fatto con awk<br />
<code>2~2p</code> « stampa tutte le righe pari (parte dalla seconda e poi ogni 2)<br />
<code>5~3p</code> « stampa le righe: &#8220;5, 8, 11,  14, &#8230;&#8221; (parte dalla quinta poi ogni 3)<br />
<code>6~10d</code> « elimina le righe: &#8220;6, 16, 26, &#8230;&#8221; (parte dalla sesta poi ogni 10)</li>
<li><code>/regex-inizio/,/regex-fine/p</code> « stampa tutte le righe comprese tra la prima che soddisfa la &#8216;regex-inizio&#8217; e una che soddisfa la &#8216;regex-fine&#8217;</li>
<li><code>1~2s/Linux/GNU\/&#38;/g</code> « sostituisce la parola &#8216;Linux&#8217; con &#8216;GNU/Linux&#8217; solo nelle righe dispari (il primo comando seleziona le righe su cui agire, se ne può usare qualunque altro per questo scopo; compreso &#8216;/regex-inizio/,/regex-fine/&#8217;! Il secondo comando agisce su queste righe decidendo il da farsi&#8230;)</li>
<li><code>s:regex:sostituto:g</code> « capita a volte di avere tanti caratteri &#8216;/&#8217; da sostituire, digitare tutte le volte &#8216;<code>\/</code>&#8216; può essere frustrante! Il comando &#8216;<code>s//</code>&#8216; si può modificare per accettare altri caratteri come limitatori, in questo caso abbiamo scelto i due punti.<br />
es.<br />
<code>s:/home/daniele:/home/andrea:g</code> « questo comando sostituisce &#8216;/home/daniele&#8217; con &#8216;/home/andrea&#8217; in un file di testo</li>
</ul>
<p>NOTA: ricordatevi che se usate dei caratteri giolli (*,+) per indicare una qualunque ripetizione di qualche carattere la regex cercherà la sequenza più lunga che riesce a trovare!! Per capire cosa questo comporta facciamo un esempio suppongendo di voler rimuovere i tag da un file html:</p>
<blockquote><p>prendiamo questa sequenza:</p>
<blockquote><p>Sono &#60;b&#62;davvero&#60;/b&#62; soddisfatto di &#60;i&#62;Linux&#60;/i&#62;!!!</p></blockquote>
<p>verrebbe naturale usare quest&#8217;espressione regolare per  rimuovere i tag:</p>
<p><code>s/&#60;.*&#62;//g</code> « che significa: sostituisci con &#8216;nulla&#8217; le sequenze che cominciano con &#8216;&#60;&#8217;, finiscono con &#8216;&#62;&#8217; e al loro interno hanno una sequenza di qualunque carattere&#8230;.</p>
<p>Il risultato di questa espressione è il seguente:</p>
<blockquote><p>Sono !!!</p></blockquote>
<p>Ha tolto tutto quello che stà tra il primo &#8221;! Evidentemente non è ciò che si voleva&#8230; per ovviare si utilizza una regex come questa:</p>
<p><code>s/&#60;[^&#62;]*&#62;//g</code> « che significa: sostituisci con &#8216;nulla&#8217; le sequenze che cominciano con &#8216;&#60;&#8217;, finiscono con &#8216;&#62;&#8217; e al loro interno hanno una sequenza di qualunque carattere che non sia un &#8216;&#62;&#8217;&#8230;</p>
<p>Il risultato è:</p>
<blockquote><p>Sono davvero soddisfatto di Linux!!!</p></blockquote>
</blockquote>
<blockquote></blockquote>
<p>Le potenzialità usando dei file di script sono anche maggiori! Vi lascio alcuni link di approfondimento ma sono sicuro che potete trovarne altri nel web&#8230;</p>
<p><a href="http://www.gentoo.org/doc/en/articles/l-sed1.xml" title="Articolo in inglese diviso in 3 parti" target="_blank">Gentoo Wiki &#8211; Sed by examples</a></p>
<p><a href="http://sed.sourceforge.net/sed1line.txt" title="Esempi di sed (tipo inserire i numeri ad inizio riga)" target="_blank">Esempi pratici sulla pagina ufficiale di sed</a></p>
<p>Tutto chiaro? Esercitatevi un po&#8217; e sarà sempre più chiaro&#8230; <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
</div>]]></content:encoded>
</item>

</channel>
</rss>
