domenica 15 settembre 2013

Brevi Esercizi: AWK, Sort e un elenco di date da sistemare.

Stamattina potevano essere le quattro, quando mi arriva una telefonata di Ciro, il pastore. Per farla breve, doveva sistemare un elenco di date. Sì, Ciro ha la licenza di chiamare a casa mia a qualsiasi ora.

Qual era il suo problema?

cat date.txt
12-4-1973
5-9-2010
9-1-1950
11-10-1980
23-5-1999
6-2-1926
27-8-2015
23-02-1903

Ciro, in pratica, voleva aggiungere uno zero davanti a giorni e mesi con un solo numero e poi ordinare l'elenco in ordine crescente in base all'anno...più o meno così:

23-02-1903
06-02-1926
09-01-1950
12-04-1973
11-10-1980
23-05-1999
05-09-2010
27-08-2015

In realtà la soluzione non è molto difficile, a patto che si conoscano alcuni comandi.


 awk -F- '{ printf "%02d-%02d-%d\n", $1, $2, $3 }' date.txt |  sort -nk3 -t -


Coloro che hanno seguito il corso di awk non dovrebbero avere problemi a capire la riga di comando. Infatti su awk non dirò nulla, eccetto una cosa su printf.

 Il flag "0" fa usare a printf dei caratteri '0' (anziché spazi) a sinistra dei numeri di ogni colonna, fino al raggiungimento di una certa lunghezza. Vabbè, su printf ci ritornerò prossimamente con un post molto serio.

Ritornerò anche sul comando sort. Ora non ho molto tempo per spiegare le cose, si sono svegliati gli ospiti prussiani e devo ancora preparare la colazione. 

A presto!


9 commenti:

  1. awk dove lavoravo era vietato perché ti consentiva di fare queste cose e per di più sulla riga di comando per cui o lo copiavi subito o ciccia.
    Poi è arrivato il DOS e quindi Windows :-(

    RispondiElimina
  2. Che tristezza...ma come si fa ad usare Windows...Cosa aveva di così strepitoso, soprattutto all'inizio...

    RispondiElimina
  3. Beh, io ricordo DB 3, e quando windows si installava con i floppy da 1,44. Se non ricordo male era la 3.1, possibile? Quella oscenità con le icone in bianco e nero che sembravano disegnate col pennarello da un bambino...
    Veramente ricordo anche il Commodore 64, e le sue istruzioni in linguaggio macchina PEEK e POKE... Sembra passato un secolo, ma questa è un'altra storia...

    RispondiElimina
  4. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  5. ciao a tutti... non so se questa è la sede più adatta. sto cercando di realizzare un programma con awk molto semplice (crediti 3 facoltà di interpretariato). il mio obiettivo è quello di calcolare la frequenza delle parole. dal programma che ho fatto io, il risulato più o meno l'ho ottenuto. vorrei solamente che mi risultino in ordine decrescente.
    qualche suggerimento.?
    programmino:
    {
    tok=tok+NF
    for(x=1; x<=NF; x++)
    {
    typ[$x]++
    }
    }
    END{
    print "su un totale di "tok" parole"
    for(t in typ)
    {
    print ""typ[t]" " t ""
    a++
    }
    print "Totale parole= "tok
    print "Parole lessico=" a
    }


    GRAZIE :)

    RispondiElimina
    Risposte
    1. risposta al volo (non ho controllato lo script): hai pensato a concatenare il risultato via pipe (|) a sort?
      Se non è urgentissimissimo possiamo parlarne.

      Elimina
    2. ho l'esame il 20 settembre... quindi diciamo che tempo c'è. adesso vado a sfogliarmi il manuale e vediamo se capisco il SORT. Il prof ci ha spiegato ben poco... pero ci ha fornito un utilissimo manuale gawk... in inglese.. da decifrare.
      cmq da stamane sono andata avanti: i miei obiettivi sono: confrontare due testi, per fari dire quante e quali sono le parole in comune e la loro frequenza.
      sembrerebbe che ci sono riuscita, ma per questioni estetiche (e magari per qualche punticino in più all'esame), mi piacerebbe avere le occorrenze in ordine decrescente.

      BEGIN{
      while ((getline <"contratto1.txt") > 0)
      {
      for (a=1; a<=NF; a++)
      {
      lex[$a] = a
      }
      }
      }
      {
      for (a=1; a<=NF; a++)
      {
      if ($a in lex)
      tok++
      {
      comune[$a] = lex [$a]
      c=c+1
      }
      }
      for(p=1; p<=NF; p++)
      {
      typ[$p]++
      }
      }
      END{
      print "I file hanno " tok " parole in comune:"
      for(t in typ)
      {
      print ""typ[t]" " t ""
      a++
      }
      }

      Elimina
    3. Prossimamente lo faccio girare e --forse-- ti dico.
      Ma solo se serve, sort è semplicissimo.
      Su AWK un mio pupil sta vedendolo se vuoi ti mando una bozza, via mail.

      Elimina
  6. Flavia mandami la tua mail via mail, la mia è n1n0.aegis [at] gmail.com che cercando altro (la serendipità) ho trovato una meraviglia che il prof (anche se la conosce probabilmente) non resisterà alla tentazione di darti un caloroso bacio (e potrai minacciarlo di denunciare il fatto ottenendo N crediti).
    No il tuo script non l'ho ancora visto ma adesso lo faccio --promesso, probabilmente, forse...

    RispondiElimina