Ancora script

geekUn post piccolo piccolo ma c’è una cosa che devo proprio dire: è una grande soddisfazione quando fai qualcosa che viene usata e apprezzata. Specie se funziona al primo tentativo, anche senza la mia assistenza 😛
Sto parlando degli script che ho raccontato qui e qui.
E la novità è che si vuole continuare su questa strada. Come ogni cosa nuova (sì ho convertito un windowsiano!) ci vuole un po’ di tempo per impratichirsi. Anche per chi vuol fare tutto da solo un paio di suggerimenti.

Con Linux (e Unix prima) ci sono tantissimi tools, fanno quasi tutto, per esempio…

Userò questo file di dati (t-scr) negli esempi che seguiranno:

uno
uno!!due
uno!!due!!quattro
uno!!d u e
1!!2!!3!!4!!5!!6!!7!!8!!9!!10

cat

Il comando cat (catenate) scrive su terminale il/i file elencati. Come sempre si possono usare le pipe, roba già vista.

tac

tac fa la stessa cosa di cat ma invertendo le righe, comincia dall’ultima e risale fino alla prima.

rev

Non so se sia utile ma si può fare la stessa cosa per ogni riga con rev (reverse).

OK, adesso arriviamo a awk, linguaggio molto versatile anche se un po’ –come dire– ecco, specie all’inizio 😯
Nota: nei file che seguono non ho inserito la shebang, la riga che consente l’esecuzione dello script con il solo nome; questo perché i codici riportati non sono completi.

BEGIN {
    FS = "!!"
}
{
    printf "%s: %s\n", NF, $0
}

0

I campi (field) di ogni riga sono separati dalla sequenza specificata nella variabile FS (field separator). Deve essere specificata prima di iniziare a processare il file, quindi nella sezione BEGIN.

La variabile NF sta per number of fields. $0 è la riga intera.

BEGIN {
    FS = "!!"
}
{
    if (NF == 2) { printf "%s: %s\n", NF, $0 }
}

1

Ecco come estrarre i soli record con due campi, quelli che c’interessano.

BEGIN { FS = "!!" }
{
    if (NF == 2) { printf "%d: %s!!%s \n", NF, $2, $1 }
}

2

I valori dei singoli campi sono contenuti nelle variabili $1, $2, … Questo è decisamente meglio che operare con rev 😛

Notare inoltre che la composizione delle righe in awk è simile a quella del C.

BEGIN { FS = "!!" }
{
    if (NF == 2) {
        printf "%d: %s!!%s \n", NF, $2, $1
        trovati++
    }
}
END { printf "trovati %d records di %d\n", trovati, NR }

3

NR è la variabile automatica che contiene il numero di record letti, cioè le righe del file nel nostro caso; ho usato la variabile trovati per memorizzare il numero di record utili; viene creata automaticamente appena viene utilizzata.

Il file dei dati può essere ordinato con sort. Il comando è, al solito, molto versatile, usa man sort per vedere le opzioni che servono.

geek tns

Per oggi basta così. Resta da verificare se awk può essere conveniente anche nel caso di elaborazioni molto più articolate sui campi. Personalmente io lo trovo utilissimo per cose non troppo complesse, poi passo a Python. C’è però chi produce script lunghi (e illeggibili); questione di gusti. Chissà se sono stato utile? 🙄

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: