Script -- sostituzione stringhe

Area di discussione libera.

Moderatore: Staff

Regole del forum
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
conraid
Staff
Staff
Messaggi: 13631
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: Script -- sostituzione stringhe

Messaggio da conraid »

anycolouryoulike ha scritto: La cosa è comica però.
Io dicevo che le tue espressioni erano sbagliate perché avevo gli spazi.
Tu dicevi che le mie espressioni erano sbagliate perché avevi i tab.
Senza esempi avremmo potuto continuare all'infinito.
Già... è il caldo dai :-)
Tanto ora arriva qualcuno e ci dice che abbiamo sbagliato entrambi e c'è "la soluzione" ;-)

Sul find ho tolto il post perché anche nel notebook ho una cosa diversa, ma in pratica riguarda l'uso o non uso delle virgolette, e quindi dell'espansione sì, dipende dai file che ho nella dir... comunque non ho testa oggi per mettermi a provare :-)

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: Script -- sostituzione stringhe

Messaggio da Mario Vanoni »

awk 'BEGIN{OFS="\t"}/./{$1==1?$1=8:$1=$1;print}' nomefile

Avatar utente
conraid
Staff
Staff
Messaggi: 13631
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: Script -- sostituzione stringhe

Messaggio da conraid »

Mario Vanoni ha scritto:awk 'BEGIN{OFS="\t"}/./{$1==1?$1=8:$1=$1;print}' nomefile
altra cosa che andrebbe imparata awk :-k

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Script -- sostituzione stringhe

Messaggio da targzeta »

Mario Vanoni ha scritto:awk 'BEGIN{OFS="\t"}/./{$1==1?$1=8:$1=$1;print}' nomefile
E tu disturbi awk per questa cosa :shock:

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: Script -- sostituzione stringhe

Messaggio da Mario Vanoni »

spina ha scritto:
Mario Vanoni ha scritto:awk 'BEGIN{OFS="\t"}/./{$1==1?$1=8:$1=$1;print}' nomefile
E tu disturbi awk per questa cosa :shock:

Spina
Dammi un one-liner piu` semplice
che risolva il quesito posto perfettamente.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Script -- sostituzione stringhe

Messaggio da targzeta »

Mario Vanoni ha scritto:...
Dammi un one-liner piu` semplice
che risolva il quesito posto perfettamente.
Ma perchè, quella postata inizialmente non va bene?

Codice: Seleziona tutto

sed -i 's/^1\t/8\t/' nomefile
Sarai sicuramente daccordo con me che sed è più appropriato per questo genere di cose giusto? E' il suo lavoro, guarda che awk si arrabbia se lo usi così...narrano le leggende che qualcuno è stato addirittura trovato nudo, tutto bagnato, e che gli mancava un rene...me lo ha detto mio cuggggino :)

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: Script -- sostituzione stringhe

Messaggio da Mario Vanoni »

spina ha scritto:
Mario Vanoni ha scritto:...
Dammi un one-liner piu` semplice
che risolva il quesito posto perfettamente.
Ma perchè, quella postata inizialmente non va bene?

Codice: Seleziona tutto

sed -i 's/^1\t/8\t/' nomefile
Sarai sicuramente daccordo con me che sed è più appropriato per questo genere di cose giusto? E' il suo lavoro, guarda che awk si arrabbia se lo usi così...narrano le leggende che qualcuno è stato addirittura trovato nudo, tutto bagnato, e che gli mancava un rene...me lo ha detto mio cuggggino :)

Spina
Se il file originale e` perfetto, sed sara` perfetto.

Se l'originale contiene spazi, tab+spazi, doppi tab, righe vuote,
awk dara` un risultato perfetto,
se le righe vuote son volute, basta eliminare /./ nello script.

Programmazione difensiva che prevede errori e li corregge.

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Script -- sostituzione stringhe

Messaggio da anycolouryoulike »

Mario Vanoni ha scritto:Se il file originale e` perfetto, sed sara` perfetto.

Se l'originale contiene spazi, tab+spazi, doppi tab, righe vuote,
awk dara` un risultato perfetto,
se le righe vuote son volute, basta eliminare /./ nello script.

Programmazione difensiva che prevede errori e li corregge.

Codice: Seleziona tutto

$ cat prova

        1       1050        -41         -76     78

1       1051    -43      -78                            85

 10             1049        -21 -56     106

                10              1050                   -21              -56     106

10      1051    -21     -56      105
    9   1049                            -18                          -53        10
$ awk 'BEGIN{OFS="\t"}/./{$1==1?$1=8:$1=$1;print}' prova
8       1050    -41     -76     78
8       1051    -43     -78     85
10      1049    -21     -56     106
10      1050    -21     -56     106
10      1051    -21     -56     105
9       1049    -18     -53     10
Incredibile!

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Script -- sostituzione stringhe

Messaggio da targzeta »

Mario Vanoni ha scritto:...
Se il file originale e` perfetto, sed sara` perfetto.

Se l'originale contiene spazi, tab+spazi, doppi tab, righe vuote,
awk dara` un risultato perfetto,
se le righe vuote son volute, basta eliminare /./ nello script.

Programmazione difensiva che prevede errori e li corregge.
Vabbuò, ma così cambi le carte in tavola :). Allora eccoti qua:

Codice: Seleziona tutto

 sed '/^[[:space:]]*$/d;s/[[:space:]]\+/\t/g;s/^\(\t\)\?1\t/8\t/;s/^\t//'
E se nel tuo file le righe vuote sono in realtà tanti spazi o tabulazioni? Il mio funziona, il tuo no :)

Visto che vuoi correggere gli errori, dovresti modificarlo così:

Codice: Seleziona tutto

awk 'BEGIN{OFS="\t"}/[[:digit:]]/{$1==1?$1=8:$1=$1;print}'
Ora, sono sicuro che riuscirai a trovare un esempio in cui il mio sed fallisce, ma sono altrettanto sicuro che anche io saprei un esempio in cui il tuo awk non farebbe bene il suo lavoro.

E' solo una questione di stili, ma io rimango dell'idea che questo è un compito per sed.

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: Script -- sostituzione stringhe

Messaggio da Mario Vanoni »

spina ha scritto:
Mario Vanoni ha scritto:...
Se il file originale e` perfetto, sed sara` perfetto.

Se l'originale contiene spazi, tab+spazi, doppi tab, righe vuote,
awk dara` un risultato perfetto,
se le righe vuote son volute, basta eliminare /./ nello script.

Programmazione difensiva che prevede errori e li corregge.
Vabbuò, ma così cambi le carte in tavola :). Allora eccoti qua:

Codice: Seleziona tutto

 sed '/^[[:space:]]*$/d;s/[[:space:]]\+/\t/g;s/^\(\t\)\?1\t/8\t/;s/^\t//'
E se nel tuo file le righe vuote sono in realtà tanti spazi o tabulazioni? Il mio funziona, il tuo no :)

Visto che vuoi correggere gli errori, dovresti modificarlo così:

Codice: Seleziona tutto

awk 'BEGIN{OFS="\t"}/[[:digit:]]/{$1==1?$1=8:$1=$1;print}'
Ora, sono sicuro che riuscirai a trovare un esempio in cui il mio sed fallisce, ma sono altrettanto sicuro che anche io saprei un esempio in cui il tuo awk non farebbe bene il suo lavoro.

E' solo una questione di stili, ma io rimango dell'idea che questo è un compito per sed.

Spina
Non voglio litigare oltre, quindi chiudo.

La tua versione di awk non e` portabile ovunque,
prova ad invocarla con awk --traditional '...
senza [[:digit;]] invece si.

Idem sed con la opzione -i,
AT&T UNIX SVR3 non la conosce affatto,
come pure non conosce le RE stile GNU.

Con righe vuote intendo righe vuote ^$ senza niente,
con spazi e/o tab dentro per me non sono vuote!

Mettendo nella riga di awk
NF==5
al posto di
/./
presumendo 5 colonne, awk == sed.

La filosofia di sed va a caratteri nella riga,
awk a campi separati, con white spaces od altro, in riga.

Umile domanda: perche' non hai proposto subito questa versione di sed?

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Script -- sostituzione stringhe

Messaggio da targzeta »

Mario Vanoni ha scritto:...
Non voglio litigare oltre, quindi chiudo...
Pensa che io mi ero persa la parte in cui stavamo litigando :)
Mario Vanoni ha scritto:...
La tua versione di awk non e` portabile ovunque,
prova ad invocarla con awk --traditional '...
senza [[:digit;]] invece si.

Idem sed con la opzione -i,
AT&T UNIX SVR3 non la conosce affatto,
come pure non conosce le RE stile GNU...
E' vero che la sezione è libera, ma qui noi si usa Slackware, a me basta che funzioni su GNU-Linux (anche perchè io faccio le prove solo sulla mia macchina, non su tutte le macchine che hai tu), detto questo, sono sicuro che si possono modificare sia l'uno che l'altro comando in modo che funzionino su tutte le piattaforme unix-like. Per quanto riguarda l'opzione '-i' di sed, versioni precedenti non la supportano, ma anche qui, basta creare un file temporaneo e poi fare un move, non ti pare? D'altro canto anche con awk bisogna seguire questa regola, visto che neanche lui intacca il file originale.
Mario Vanoni ha scritto:...
Con righe vuote intendo righe vuote ^$ senza niente,
con spazi e/o tab dentro per me non sono vuote!

Mettendo nella riga di awk
NF==5
al posto di
/./
presumendo 5 colonne, awk == sed.

La filosofia di sed va a caratteri nella riga,
awk a campi separati, con white spaces od altro, in riga.

Umile domanda: perche' non hai proposto subito questa versione di sed?...
Penso che sia per lo stesso motivo per cui tu non hai proposto subito la versione di awk con NF==5, perchè noi si rispondeva al post iniziale, che, citando, diceva:
...
Ho dei file contenenti dei dati separati dal carattere "tab" di questo tipo..
e non:"ho dei file con campi separati da spazi, o tab, o che iniziano con spazi o tab...".
Tu mi hai chiesto un comando che rispondesse alla domanda inziale, e non a quella a cui rispondevi tu :lol:.

Mario, io vengo in pace, è che siamo entrambi pignoli e vogliamo vincere sempre....proprio come si addice a dei bambini piccoli :). Sono ancora convinto che in questi casi bisogna usare sed, ma anche se tu mi avessi convinto del contrario, non te l'avrei mai data vinta...proprio come non me la vuoi dare vinta tu...perchè, ammettiamolo....sono più forte io, ahaha.

Scherzo Mario, veniamo solo da due scuole diverse,
Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: Script -- sostituzione stringhe

Messaggio da Mario Vanoni »

spina ha scritto: Scherzo Mario, veniamo solo da due scuole diverse,
Spina
Scuole diverse? Si!
Nel mondo UNIX la portabilita` e` sempre stata molto importante,
periodo AT&T e Berkeley BSD, entrambi ci badavano.
Ho solo macchine GNU/Linux, ma non uso _mai_ gli estremi GNU.
Non sai mai su che macchina ti possono chiamare, prudenza!
In uno shell script preferisco `cmd` a $(cmd), funziona sempre.

Ciao e grazie per la interessante discussione
Mario Vanoni

Rispondi