Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [BASH] estrapolazione dati da mailbox (sed)

    Sera a tutti,
    Ho un grosso file, le presenze dei dipendenti fatte via mail, con dati simili a questo:
    codice:
    "ENTRATA";"Uno <uno@miosito.it>";"presenze@miosito.it, ss.mm.tt.uu@gmail.com";01/08/2011 8.59; ;"Uno:    -IN-
    
    -- 
    Qualora il vostro client di posta elettronica non fosse predisposto per l'invio automatico della ricevuta di avvenuta lettura si prega di inviarne una come normale mail.
    
    Informativa ai sensi del D. Lgs. 196 del 30/06/2003 . Il contenuto di questa e-mail e degli eventuali allegati , deve essere nella disponibilità del solo destinatario. Se ricevete per errore questa e-mail siete pregati di informarci e di provvedere alla rimozione della suddetta e degli eventuali allegati.
    Le e-mail in partenza e in arrivo possono essere oggetto di monitoraggio da parte della Ditta per questioni di sicurezza riguardanti la struttura informatica della Ditta stessa.
    Chiunque venga in possesso non autorizzato di questa e-mail è obbligato dalla Legge a non leggerne il contenuto, a non copiarla, a non diffonderla e a non usarla.
    
    Per l'esercizio dei diritti di cui all'art. 7 del d.lgs.196/2003 ci si può rivolgere al ""Titolare del trattamento dei dati""
    
    Via posta ordinaria:
    Ditta
    Via XXX, 999
    99999 - Quaela (XX)
    
    Via fax:
    +39-999-999999
    
    Via e-mail:
    sss.ttt.uuu@gmail.com
    "
    "USCITA";"Uno <uno@miosito.it>";"presenze@miosito.it, ss.mm.tt.uu@gmail.com";30/07/2011 17.40; ;"Uno:    -OUT-
    [...]"
    --
    Sono riuscito con qualche sed a trasformarlo in questo:
    codice:
    [...]
    07/07/2011;08;18;-IN-
    06/07/2011;18;39;-OUT-
    06/07/2011;17;18;-IN-
    06/07/2011;15;18;-OUT-
    06/07/2011;13;05;-IN-
    06/07/2011;12;40;-OUT-
    06/07/2011;11;59;-IN-
    06/07/2011;11;40;-OUT-
    06/07/2011;08;59;-IN-
    05/07/2011;19;59;-OUT-
    [...]
    E' già un ottimo risultato (good) per me. Importo il file in MsExcel e spostando un pò di celle ottengo tutta una serie di conteggi per la nota ore/ferie/ecc. senza troppi patemi d'animo.

    Il top (b2b) però sarebbe riuscire ad automatizzare il 99% del mio lavoro ottenendo un file come questo:
    codice:
    [...]
    05/07/2011;06;42;10;12
    06/07/2011;08;59;11;40;11;59;12;40;13;05;15;18;17;18;18;39
    07/07/2011;12;40;13;05;15;18;17;18;18;39;19:00
    08/07/2011;09;58;12;41;12;58;13;41;14;05;17;18;19;18;19;40
    [...]
    Un bel csv da importare direttamente nel foglio MsExcel.

    Ma un lavoro del genere va ben oltre le mie capacità attuali. Me ne sono andato a spanne e ho capito questo:
    Dovrei prendere i primi 10 caratteri e utilizzarli come parametro di riferimento e operare sul risultato del sed
    codice:
    [...]
    06/07/2011;12;40;-OUT-
    06/07/2011;11;59;-IN-
    06/07/2011;11;40;-OUT-
    [...]
    con qualcosa del tipo:
    se "i primi 10 chr" sono uguali a "06/07/2011"
    allora "prendi i chr da 11 a 16" e accodali al nuovo file sulla riga che inizia con "06/07/2011"

    Ahimé mi ci sono perso solo a pensarci. >

    Chiedo dunque lumi perché non so proprio o, meglio, non ho le capacità per impostare la questione :-\

    Grazie mille in anticipo,

    C0

  2. #2
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    non so se ho capito bene tutto, ma un input te lo posso dare

    supponendo di avere in un file chiamato c.txt questa roba:

    codice:
    07/07/2011;08;18;-IN-
    06/07/2011;18;39;-OUT-
    06/07/2011;17;18;-IN-
    06/07/2011;15;18;-OUT-
    06/07/2011;13;05;-IN-
    06/07/2011;12;40;-OUT-
    06/07/2011;11;59;-IN-
    06/07/2011;11;40;-OUT-
    06/07/2011;08;59;-IN-
    05/07/2011;19;59;-OUT-
    e supponendo di voler raggrupare le righe in base alla prima colonna, concatenando le colonne 2 e 3, ti basta fare:

    codice:
    awk 'BEGIN{FS=";"}{a[$1]=a[$1]";"$2";"$3}END{for (i in a) printf("%s%s\n",i,a[i])}' c.txt|sort
    (il sort ovviamente e' opzionale)

  3. #3

    [RISOLTO]

    Grazie grazie grazie!

    Ho provato la tua stringa, funziona quasi a meraviglia. Ho dovuto solo aggiungere allo script questa riga prima del tuo awk:

    codice:
    sort -k1 file1.txt > file2.txt
    Senza, vista la natura del file mailbox, non accodava i dati nel modo corretto.

    Risultato con il sort come nel tuo esempio:
    codice:
    04/07/2011;17;37;09;12
    05/07/2011;17;40;08;53
    06/07/2011;18;40;08;59
    07/07/2011;18;39;09;18
    Dove si nota che l'orario d'uscita si trova prima di quello d'entrata.


    Risultato con la riga di sort nello script prima del tuo awk:
    codice:
    04/07/2011;09;12;17;37
    05/07/2011;08;53;17;40
    06/07/2011;08;59;18;40
    07/07/2011;09;18;18;39
    Dove gli orari sono accodati correttamente.


    Grazie ancora, preziosissimo il tuo aiuto, ero in un'impasse bilateralepolivalente come fosse Antani.

    C0

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.