Newsgroup: it.comp.os.linux.iniziare
Titolo: Domandona su Sed

So che si puo` fare, ma mi manca qualcosa per risolvere.
Ho un file csv al quale devo sostituire una stringa tipo 1,234.56 con
1234.56
In pratica devo eliminare la , quando mi si presentano numeri cosi`
formattati.
Ovviamente la , compare anche come separatore di campo, quindi una
semplice sostituzione non e` possibile.
La regexp per selezionare la stringa incriminata: 
[0-9]\+,[0-9]\+\.[0-9]\+
Si, potrei risolvere usando perl o con altri sistemi. Tuttavia mi
piacerebbe usare sed sia per l'eleganza e la sintesi, sia per
imparare ad usarlo meglio.
Qualche idea ?
-- 
--> x3m <--

 Qualche idea ?
A meno di non introdurre ulteriori condizioni (ad esempio che il campo 
precedente e successivo al campo che vuoi cambiare non e' numerico) la vedo 
dura.

 Qualche idea ?
?? hai gia' detto tutto tu:
sed 's|,\([0-9]\+\),\([0-9]\+\)\.\([0-9]\+\),|,\1\2.\3,|' iltuofilequi
Davide

Davide Bianchi wrote:

Il problema di questo e' che in questa situazione:
123,456.10,789
dove il primo campo e' "123", il secondo e' "456.10" e il terzo e' "789", 
viene eliminata la virgola che separa il primo campo dal secondo, mentre 
nella sua descrizione non ci sarebbe da cambiare niente.

antani wrote:

Ok, nel tuo caso specifico no, pero' allora il tuo non funziona se il campo 
da cambiare e' il primo o l'ultimo, o se ce ne sono due consecutivi.
In tutti i casi, la descrizione originaria e' molto ambigua.

 writes:

prendere il tipo che ha creato il tuo file csv con
  - separatore dei campi =      ","
  - separatore delle migliaia = ","
e mandarlo in miniera
-- 
But let me ask you one more time, O children of the dusk,
All these hunters who are shrieking now oh do they speak for us?

 Qualche idea ?
si, facci vedere qualche riga del file in questione, e come lo
vorresti modificare
-- 
Sarebbe essere un atto di pieta'. 
Contro i miei principi.                            -- whip,  in IFMdI

 modificare
preferivo la tua prima risposta
comunque credo che servano un po' di if, indi usare un linguaggio
nel senso, se i numeri hanno TUTTI una parte decimale allora si fa anche 
con sed, altrimenti no credo.

 sed 's|,\([0-9]\+\),\([0-9]\+\)\.\([0-9]\+\),|,\1\2.\3,|'
Lo dicevo che mi mancava qualcosa: le parentesi, dannazione, le
parentesi.
Grazie mille.
-- 
--> x3m <--

 e mandarlo in miniera
E` un csv 'regolare', credo prodotto con openoffice.
Dove c'e` ambiguita` i campi sono tra apici.
Cmq risolto, grazie.
-- 
--> x3m <--

 niente.
Fortunatamente il numero che ho e` in formato 1,234.56 come
specificato nel post. Sono salvo. :-)
-- 
--> x3m <--

 formattati.
A me pare che il problema si possa riformulare così: devi eliminare le virgole
comprese fra due cifre.
Se il problema non fosse solo questo, l'ambiguità ci sarebbe di base:
interpretando 1,234.56, infatti, come potresti distinguere 1234.56 da
1  -  234.56?
Io penso che a te basti qualcosa come:
sed 's/\([0-9]\)\(,\)\([0-9]\)/\1\3/g' < vecchiofile > nuovofile
-- 
Bye, Lem
Ceterum censeo ISLAM esse delendum
____________________________________________________________________________
Non sprecare i cicli idle della tua CPU: 
http://boinc.berkeley.edu/index.php

 Dove c'e` ambiguita` i campi sono tra apici.
Dirlo subito no eh?

 Dirlo subito no eh?
Scusa. Per la verita` non mi sembrava un'info essenziale sapere da
dove viene il file in quanto non spostava di una .. virgola :-) ...
il problema. Comunque la prox volta saro` meno parco di info.
-- 
--> x3m <--

 
Hai gia' fatto tutto... basta che metti tra parentesi "\(" e "\)" le 
parti da "separare"... e poi le richiami con \1 \2 \3 ecc.
$ echo "123, qwe, 1,234.56, qwe, rty" | \
   sed 's/\(.*[0-9]\+\),\([0-9]\+.[0-9]\+.*\)/\1\2/g'
123, qwe, 1234.56, qwe, rty
-- 
Il Paradiso sono gli altri - Ertras

 preferivo la tua prima risposta
la mia prima risposta era esaustiva, apodittica e conclusiva
te credo che te piaceva...

 dove il primo campo e' "123", il secondo e' "456.10" e il terzo e' "789",
Come fai a dire che il primo campo e' 123 ed il secondo 456 e non un
primo campo 123,456.10 ed un secondo 789? In questo caso il separatore
e' ambiguo, quindi entrambe le definizioni sono corrette.
Davide

Davide Bianchi wrote:

Mi riferivo al caso in cui la riga di cui sopra sia da interpretare (perche'
chi l'ha prodotta intendeva cosi') come campo1=123, campo2=46.10 e
campo3=789. E' chiaro che un programma non puo' arrivare a capire che
l'utente vorrebbe quella suddivisione, e la descrizione originaria del
problema (che poi si e' rivelata non corretta) era percio' ambigua.