Newsgroup: it.comp.os.linux.software
Titolo: script con awk

ciao
dovrei processare 2 file ed ho pensato di farlo con awk, ma non ci
salto fuori
il primo ha questa struttura:
...
Nessun messaggio per pippo su 
mail2.netscalibur.it
36 messaggi per pluto su 
mail2.netscalibur.it
 (216049 byte).
1 messaggio per  haga su 
mail2.netscalibur.it
 (3362 byte).
Nessun messaggio per aguilar su 
mail2.netscalibur.it
64 messaggi per alberto su 
mail2.netscalibur.it
 (4360003 byte).
....
il secondo invece:
...
campo1,campo2,campo3,campo4,25000
campo1,campo2,campo3,campo4,25000
campo1,campo2,campo3,campo4,35000
campo1,campo2,campo3,campo4,25000
ecc...
dovrei estrarre e confrontare il dato " (216049 byte) " del primo file
con 25000 del secondo
adesso sono arrivato ad ottenere con awk "(216049 byte)."  ma non
riesco a togliere le tonde e il punto poi dovrei confrontarlo con
25000 e in base al confronto mandare in OUTPUT un msg
Mi aiutate

 Mi aiutate
Il secondo è il più facile, metti la virgola come FS (separatore di campo)
e stampi solo il quinto campo.
Per il primo non sono sicuro.
Magari puoi dare due simboli come FS. Prova a definire FS= [()]
a questo punto il secondo campo è la parte compresa tra parentesi ;-)
Altrimenti, devi usare tecniche sed-like, ossia cancellare 
tutto dall'inizio a ( e da ) alla fine.
ciao, Andrea

 ciao, Andrea
io, somunque, userei perl...

 con 25000 del secondo
dal tuo post non e' chiaro, ma pare che la riga n del file1
corrisponda alla riga n del file2
se ho immaginato giusto, allora
% cat file1 
Nessun messaggio per pippo su 
mail2.netscalibur.it
 
36 messaggi per pluto su 
mail2.netscalibur.it
 (216049 byte). 
1 messaggio per  haga su 
mail2.netscalibur.it
 (3362 byte). 
Nessun messaggio per aguilar su 
mail2.netscalibur.it
 
64 messaggi per alberto su 
mail2.netscalibur.it
 (4360003 byte). 
% cat file2
campo1,campo2,campo3,campo4,25000 
campo1,campo2,campo3,campo4,25000 
campo1,campo2,campo3,campo4,35000 
campo1,campo2,campo3,campo4,25000 
campo1,campo2,campo3,campo4,25000 
% paste file2 file1 | grep -v 'Nessun messaggio' | awk '{ 
  split($1,a,",") ; n1=a[5] 
  n2=$(NF-1) ; gsub("[^0-9]","",n2) 
  print n1, n2 
}' 
25000 216049
35000 3362
25000 4360003
% 
-- 
CLICKED BY HUNDREDS OF CARRIERS. SINKING. U-872.

Skull wrote:

concordo!
PERL = Practical Extraction and Report Language ;-)
ciao, Andrea

% 
in 3 righe di script mi hai insegnato un sacco di cose, non sapevo
dell' esistenza di paste...
Vorrei che tu fossi cosi gentile da spiegarmi 2 cose
gsub("[^0-9]","",n2) come fa ad arrivare ad ottenere la cancellazione
delle tonde. Nella documentazione di grep e compagnia dice che [^0-9]
stampa i caratteri che nn corrispondono a quanto inserito
nell'intervallo tra [ ], metre qui fa il contrario. Ho provato a
togliere il ^ e stampa caratteri alfabetici e non numerici.
Altra cosa nella documentazione di awk dice che gsub torna il numero
di sostituzioni effettuate, mentre qui torna la stringa senza (). Me
lo puoi spiegare
Hai qlc link in italiano su espressioni regolari e awk?
grazie

kappa writes: 
 > >% paste file2 file1 | grep -v 'Nessun messaggio' | awk '{  
 > >  split($1,a,",") ; n1=a[5]  
 > >  n2=$(NF-1) ; gsub("[^0-9]","",n2)  
 > >  print n1, n2  
 > >}'  
 > >25000 216049 
 > >35000 3362 
 > >25000 4360003 
 
 > in 3 righe di script mi hai insegnato un sacco di cose, non sapevo 
 > dell' esistenza di paste... 
 
   adesso non andarlo a spifferare a chiunque 
 
 > Vorrei che tu fossi cosi gentile da spiegarmi 2 cose 
 
 > gsub("[^0-9]","",n2) come fa ad arrivare ad ottenere la 
 > cancellazione delle tonde. 
 
   gsub(cosa_cera,cosa_ci_sara,dove) 
 
   gsub prende la variabile "dove", e in ogni punto dove trova 
   l'argomento "cosa_cera" mette l'argomento "cosa_ci_sara", e infine 
   mette il risultato della sostituzione in "dove" 
 
   esaminiamo il nostro caso 
 
   cosa_cera e' "[^0-9]" ovvero ogni carattere non numerico 
 
   cosa_ci_sara e' "", ovvero nulla 
 
   se metti un print n2 prima del gsub ti accorgi che n2 contiene una 
   stringa tipo "(14231234" 
                 -++++++++ 
 
   quindi il nostro uso di gsub prende tutti i caratteri non numerici 
   di n2, li sostituisce con nulla, e infine mette il risultato nella 
   variabile "dove" 
 
   il fatto che ritorni il numero delle sostituzioni effettuate e' per
 
   noi irrilevante, ma vedi sotto 
 
   nota che la piu' semplice istruzione gsub("(","",n2) nel nostro
   caso ha lo stesso effetto, ma nota anche che come e' stata scritta
   e' piu' generale
 
 > Nella documentazione di grep e compagnia dice che [^0-9] stampa i 
 > caratteri che nn corrispondono a quanto inserito nell'intervallo 
 > tra [ ], metre qui fa il contrario. Ho provato a togliere il ^ e 
 > stampa caratteri alfabetici e non numerici. 
 
 non "stampa" ma "identifica" 
 
 > Altra cosa nella documentazione di awk dice che gsub torna il 
 > numero di sostituzioni effettuate, mentre qui torna la stringa 
 > senza (). Me lo puoi spiegare 
 
 non e' vero che qui ritorna la stringa, gsub ritorna sempre il numero
 di sostituzioni, solo che il nostro script non assegna questo numero 
 ad una variabile 
 
 il vero lavoro di gsub non consiste nel contare le sostituzioni 
 effettuate, ma nel fatto che il contenuto di, nel nostro esempio, 
 "n2" viene cambiato 
 cerca di capire cosa fa lo script awk qui sotto, e poi fallo girare
 
echo "asdef asdefasdef" | awk '{ 
  print "" 
  print "Numero di campi", NF 
  var=$NF; 
  print "La variabile <var> contiene l'\''ultimo campo" 
  print "var=\"" var "\"" 
  print "Sostituiamo in <var> tutte le occorrenze di \"sd\" con
  \"SD\"" 
  ns=gsub("sd","SD",var) 
  print "Il numero di sostituzioni operato e'\''", ns 
  if (ns>0) print "La variabile <var> e'\'' quindi stata modificata!" 
  if (ns==0)print "La variabile <var> non e'\'' quindi stata
  modificata!" 
  print "var=\"" var "\""}' 
 
 > Hai qlc link in italiano su espressioni regolari e awk? 
 
 no, ma se conosci un po' di inglese e se trovi qualcuno che ti presta
 
                    "The awk programming language" 
 
 trovi tutto quello che ti serve, e secondo me e' anche una buonissima 
 introduzione alla programmazione (da un punto di vista forse un po'
 eclettico, ma tant'e'...)
-- 
ANNOYED BY DESTROYER. SINKING. U-213.

   print "var=\"" var "\""}' 
cazoz ha riformattato un paio di linee...
echo "asdef asdefasdef" | awk '{ 
  print "" 
  print "Numero di campi", NF 
  var=$NF; 
  print "La variabile <var> contiene l'\''ultimo campo" 
  print "var=\"" var "\"" 
  print "Sostituiamo in <var> tutte le occorrenze di \"sd\" con \"SD\"" 
  ns=gsub("sd","SD",var) 
  print "Il numero di sostituzioni operato e'\''", ns 
  if (ns>0) print "La variabile <var> e'\'' quindi stata modificata!" 
  if (ns==0)print "La variabile <var> non e'\'' quindi stata modificata!" 
  print "var=\"" var "\""}' 
cosi' potrebbe funzionare...
-- 
ATTACKED BY ATOMIC BOMB. WEB PAGES. SINKING. U-80.