Newsgroup: it.comp.os.linux.sys
Titolo: Awk e il logorio mentale ....

okkei sto impazzendo ....
Ho un file tipo:
** lun 07lug ** 0900 ** 1800 ** 0100 ** y ** 0100 **
** mar 08lug ** 0800 ** 2000 ** 0100 ** y ** 0230 **
Dove ho Data - Ingresso - Uscita - Lunch - Reperibilità - H di rep.
Voglio usare awk (sarebbe meglio usare altro, bla bla, ok lo so, l'ho usato
apposta questo sistema per fare pratica quindi niente discussioni
filosofiche su perl o altri linguaggi) ;-))
Per avere il tot ore faccio:
      Ore=$4-$3-$5
E mi restituisce giustamente un valore tipo "0800"
metre se prendo solo il campo $7 mi restituisce " 0100 " con gli spazi.
Il comportamento 'giusto' sarebbe il secondo (anche se a me fa più comodo il
primo) ma mi chiedevo questo: perchè nel primo caso mi somma i valori senza
fare problemi e mi toglie lo spazio?
A me serve senza spazio e mi va bene ma vorrei capire perchè fa così ... mi
viene in mente che potrebbe togliere gli spazi bianchi in caso di operazioni
aritmetiche e fare la somma, poi il risultato lo da senza spazi, ma se io
invoco awk con l'opzione -F "**" non dovrebbe ignorare gli spazi e usare
come separatore solo "**" ??
--------------------------------
Inviato via 
http://usenet.libero.it

 come separatore solo "**" ??
Ma no!
Cosi` dici ad awk di usare "**" come
separatore. Punto.
In questo caso gli spazi sono caratteri
validi come tutti gli altri, quindi
vengono presi in considerazione.
Perche` dovrebbe ignorarli?
C'e` una soluzione.
Il separatore specificato con -F e`
un'espressione regolare, quindi puoi
giocarci per ottenere quello che vuoi.
Infine, perche` non usare -F" ** "?
bye,
-- 
   Piergiorgio Sartor

 Infine, perche` non usare -F" ** "?
perchè i campi hanno più spazi fra i "**" e il valore .... non c'è un modo
per usare "**" e il blank space ?
G.


 usare come separatore solo "**" ??
Esatto, con il risultato che hai delle stringhe contenenti numeri e
spazi.
Awk gestisce tutti i tipi di dato come stringa, salvo castarli a numerico
in caso di operazioni aritmetiche, operazione nella quale ovviamente
perdi gli spazi.
Per cui il risultato dell'operazione lo vedi senza spazi (li ha persi),
mentre $7 è nata stringa ed è rimasta stringa...
Spero di non essermi incasinato troppo...
PS: secondo me per quello che stai facendo awk va benone.. è fatto per
quello...
-- 
Emanuele Balla  aka Skull -  Public Key #661E5CBF on 
www.keyserver.com
+----------------------------------------------------------------------+
"And 1.1.81 is officially BugFree(tm), so if you receive any bug-reports
on it, you know they are just evil lies." (By Linus Torvalds)


Come immaginavo, mi va anche bene ma ora ho il seguente problema che vorrei
risolvere in modo elegante, il campo $7 è " 0100 " e io voglio togliere gli
spazi, c'è una funzione di awk che lo fa o devi fare 
q.sa
 di brutto tipo
$7-$7+$7 ?!? ;-) o fare un substring ma mi pare brutto, se mi cambia il
numero di spazi?
G.


 per usare "**" e il blank space ?
Espressione regolare che descrive cio`
che vuoi tu.
bye,
-- 
   Piergiorgio Sartor

 che vuoi tu.
e beh grazie, è quello che mi manca! ;-) Adessi faccio un po di prove.....
mi sembra una barzellatta. Un uomo su un dirigibile si perde e chiede ad un
passante sotto di lui: Scusi dove sono? E lui risponde: "E' su un
dirigibile!" etc etc La sapete?!?!?! è vecchia ...


 "E' su un dirigibile!" etc etc La sapete?!?!?! è vecchia ...
deheeehe...
awk -f " +*2 +"
fose funge ma non ho provato ;-)


 fose funge ma non ho provato ;-)
penso di aver dimenticato un backslash, ma lascio a te capire se e dove
:-P


 dirigibile!" etc etc La sapete?!?!?! è vecchia ...
La domanda e`:
Conosci le espressioni regolari oppure no?
Se le conosci, non dovresti avere problemi.
Se non le conosci, dato che ti capitera` di
usarle molto spesso (con awk) e meglio che
inizi a studiarle.
Comunque, una soluzione potrebbe essere:
'\\*\\*| *'
In questo caso, pero`, la posizione dei record
potrebbe cambiare.
Altrimenti potrebbe essere:
' *\\*\\* *'
Questa richiede che "**" sia sempre presente.
Tra l'altro mi domando come "**" possa funzionare...
Ripensandoci, forse meglio usare "gawk".
Devi fare un po' di test.
bye,
-- 
   Piergiorgio Sartor

 ha scritto:

--------------------------------
Inviato via 
http://usenet.libero.it

Non c'è una funzione che toglie gli spazi? Ho provato a cercare ma non ho
trovato niente. Perchè con le regex non si comporta bene ;-) in realtà mi
sta bene che divida i campi solo in base "**" ma poidevo togliere lo spazio.
Potrei obbligarlo a fare un'operazione ($7+$7-$7) e ottengo il campo $7
numerico senza spazi, ma mi fa schifo come soluzione! :)
Potrei fare una substring ma se mi cambia il numero degli spazi non funziona
più un tubo.
Any clue?
G


 più un tubo.
Uh?
bye,
-- 
   Piergiorgio Sartor

 Piergiorgio Sartor


 > gli spazi. Riprova.
Allora, ho provato, la linea è:
** mar 08lug ** 0800 ** 2000 ** 0100 ** y ** 0230 **
con -F' *\\*\\* *' il campo $1 è blank, il campo $2 è "mar 01lug" ma
effettivamente il campo $7 è "0100" senza spazi ....
[root@0 script]# cat ns_lug2003.rep|awk -F' *\\*\\* *' '/lug/{ print
length($7) } '
0
4
La tua regex considera " " come un FS o solo lo spazio in presenza di "*" ?
Un po machiavellica come domanda ... :) Perchè non capisco come mai :
[root@0 script]# cat ns_lug2003.rep | awk -F' *\\*\\* *' '/lug/{ print $2 }
'
mar 01lug
mer 02lug
non mi divide a sto punto anche la data se " " è un FS ....
Vado a mangiare e rifocillo le energie ... poi provo a rispondermi da solo!
:)))
Tx,
G.


 La tua regex considera " " come un FS o solo lo spazio in presenza di "*" ?
No, la mia regexp deve avere sempre "**"
nel mezzo ed un numero imprecisato (anche
zero) di spazi a dx e sx.
Altrimenti devi usare l'espressione "or",
cioe` qualcosa come (non ho provato):
-F'\\*\\*| +'
cioe` "**" oppure uno o piu` spazi.
In questo caso, pero` "** " dovrebbe
separare un campo nullo...
Devi fare un po' di prove.
bye,
-- 
   Piergiorgio Sartor


cos' fa casino ... a seconda della riga mi stampa colonne diverse ... roba
da non credere all'output dei comandi ... tutto considerato io voglio che
divida per "**" e poi voglio togliere gli spazi, quindi -F "**" e poi
gensub() . Comunque mi studio le regex!! :)
Grazie mille a tutti,
G
PS: Ma perchè tutti postano domande e poi (quasi) nessuno ringrazie alla
fine dicendo se ha risolto? Non è simpatico, non vi sembra? :))


>
-F' *\\*?\\*? *'
Sempre piu` criptico... :-)
Da: "First NON obfuscated Perl programming contest"
bye,
-- 
   Piergiorgio Sartor

 Piergiorgio Sartor


 Si insomma le conosco di nome ! ;-)
Se vuoi farti aiutare:
http://txt2regex.sourceforge.net/
Ciao.
-- 
***  Per E-mail rimuovi ModE dall'indirizzo  ***
  *** Linux user # 198661 --- ICQ 33500725 ***
*** homepage 
http://web.tiscalinet.it/kailed
 ***
            *** Powered by Linux ***

 
http://txt2regex.sourceforge.net/
Bellino, non l'avevo mai visto. E` anche in debian repository. :)
-- 
                         Maurizio - Tannoiser - Lemmo
                 Founder Member of ERLUG 
http://erlug.linux.it
-------------------------------------------------------------------------------
Take a jump. A million lemmings can't all be wrong.

 Bellino, non l'avevo mai visto. E` anche in debian repository. :)
E' un po' che me lo sono segnato ma ancora non l'ho provato.
Tu l'hai fatto ?


 fatto ?
Occhiatina veloce. Sembra funzionale. L'interfaccia non e` male.
Mi sembra un buon aiuto sia a chi e` a digiuno, sia a chi un po` le sa,
ma ne vuole costruire di piu` "complesse" (si parla sempre di regex).
Bella la feature con le "regex" per i vari applicativi.
Non ho provato a costruire regex complesse, ma vorrei farlo.
Quelle che ho provato mi sembravano corrette.
-- 
                         Maurizio - Tannoiser - Lemmo
                 Founder Member of ERLUG 
http://erlug.linux.it
-------------------------------------------------------------------------------
Company slogan: The Mandatory Beatings Will Continue Until Morale Improves.