[Linux-Biella] awk cut caz maz...

Andrea Ferraris linux@ml.bilug.linux.it
Sun, 21 Mar 2004 09:38:15 +0100


> From: <vallinidaniele@libero.it>
[...]
> Ti invio una soluzione in perl.
> Non chiarisci pero' quali sono gli elementi stabili nelle righe da
elaborare.
> Supponendo stabile la posizione dei dati sulle colonne e considerando di
> elaborare solo le prime 3 righe farei:
>
> #!/usr/bin/perl
> print "\nelaboro la rumenta di LeOS\n";
> open A, "path del file input";             # apro file in lettura
>  $"="";                                    # separatore di lista nullo

Hai voglia di spiegarmelo? Ovvero cos'e` un operatore di lista e
nei dettagli quei 3 doppi apici.

>  @riga=<A>;                                # creo array righe pagina
>  foreach $numriga(0..2)                    # processo 3 righe dati

E se invece le voglio processare tutte?

>                                            # (attenz.riga 0 e' la prima)
>   {@dati=split (//,@riga[$numriga]);       # righe dati
>    $ora="@dati[7..11]";                    # ora
>    $dominio="@dati[23..34]";               # dominio
>    open B, ">>path del file output";       # apro file in append (quando
>                                # rilanci lo script azzera il file output)
>    print B "$ora $dominio\n";              # scrivo i dati richiesti
>    }
> close A;                                   # chiudo il descrittore
> print "\nfinito di elaborare la rumenta di LeOS\n";
>
> Altrimenti devi cambiare separatore di lista e casinare ulteriormente
> sulle righe in output.

Questa soluzione mi ha fatto venire in mente l'analogo in sh,
vediamo quale e` piu` lunga ;-)

#!/bin/sh # funziona probabilmente solo su Linux, altrimenti /usr/bin/sh
echo elaboro la rumenta di LeOS # e qui si risparmiano 2 doppi apici e 2 nl
e 1 ;
while read R # leggo il file (vedi linea del done) mettendo ogni riga nella
variabile R
do
     echo `echo $R | cut -c7-11`" "`echo $R | cut -c23-34`
done < "path del file input"
echo finito di elaborare la rumenta di LeOS

Sembra piu` corta ;-) pero` non elabora le prime 3 righe, ma tutte, anche
se, usando dei campi di dimensione fissa, taglieremmo indirizzi IP con piu`
di 12 caratteri, come p.es. 192.168.77.111.

Come postilla aggiungerei che sulle circa 700 macchine UNIX (circa 60%
Solaris,
35% HP-UX e 5% fra Linux e Unix Digital) su cui mi capita di dover mettere
le mani in questo periodo, di default perl non c'e` mentre c'e` la shell con
le sue utilities e awk (come al solito, quello di default di Solaris fa
cagare e per fare cose carine bisogna usare nawk che clementemente hanno
messo a disposizione, come per usare egrep bisogna andare a cercarsela col
lanternino in /usr/xpg4/bin).

Andrea