Come modificare il formato numero (separatore decimale diverso) da XXXXXX.XXX
a XXXXXX,XXX
utilizzando sed
o awk
?Come modificare il separatore decimale con awk/sed?
risposta
Si potrebbe fare questo:
echo "XXX.XX" | sed s/\./,/g
Penso
s/\./,/g
dovrebbe servire che u vuole ... a meno che u desidera qualcosa di più speciale ...
Dal momento che la domanda è anche taggato awk
:
awk 'gsub(/\./,",")||1'
se avete bash/ksh etc
var=XXX.XXX
echo ${var/./,}
Bello, qui ce n'è uno più ingombrante che funziona in tutte le shell POSIX: 'var = XXX.XXX; echo $ {var%. *}, $ {var ## *.} ' – schot
Non sarebbe questo essere più precisi, come i whas OP parlando di numeri .. per assicurarsi che sia un numero che porta prima del punto. Il documento potrebbe contenere altri punti che l'OP non vuole sostituire.
sed '/[0-9]\./s/\./,/g'
Quanto rigoroso vuoi essere? È possibile modificare tutti i caratteri .
, come altri hanno suggerito, ma ciò consentirà molti falsi positivi se si dispone di più di un semplice numero. Un po 'più severo sarebbe quella di richiedere che ci sono cifre su entrambi i lati del punto:
$ echo 123.324 2314.234 adfdasf.324 1234123.daf 255.255.255.0 adsf.asdf a1.1a |
> sed 's/\([[:digit:]]\)\.\([[:digit:]]\)/\1,\2/g'
123,324 2314,234 adfdasf.324 1234123.daf 255,255,255,0 adsf.asdf a1,1a
che non consente modifiche in un paio di casi strani, vale a dire 255.255.255.0
e a1.1a
, ma gestisce "normali" i numeri in modo pulito.
Se si desidera sostituire il separatore decimale per scopi cosmetici
Nella maggior parte dei casi tr
è probabilmente il modo più semplice per sostituire i caratteri:
$ echo "0.3"|tr '.' ','
0,3
Naturalmente se avete a che fare con i numeri di miscelazione di ingresso e stringhe , avrai bisogno di un approccio più robusto, come quello proposto da Michael J. Barber o anche di più.
Se si desidera sostituire il separatore decimale per scopi di calcolo
Per impostazione predefinita gawk
(GNU awk
, vale a direla awk
della maggior parte delle distribuzioni GNU/Linux) utilizza il punto come separatore decimale:
$ echo $LC_NUMERIC
fr_FR.UTF-8
$ echo "0.1 0.2"|awk '{print $1+$2}'
0.3
$ echo "0,1 0,2"|awk '{print $1+$2}'
0
Tuttavia è possibile forzarlo ad utilizzare il separatore decimale del locale corrente utilizzando l'opzione --use-lc-numeric
:
$ echo $LC_NUMERIC
fr_FR.UTF-8
$ echo "0.1 0.2"|awk --use-lc-numeric '{print $1+$2}'
0
$ echo "0,1 0,2"|awk --use-lc-numeric '{print $1+$2}'
0,3
Se il formato di input è diverso dal locale corrente, puoi naturalmente ridefinire LC_NUMERIC temporaneamente:
$ echo $LC_NUMERIC
fr_FR.UTF-8
$ echo "0.1 0.2"|LC_NUMERIC=en_US.UTF-8 awk --use-lc-numeric '{print $1+$2}'
0
$ echo "0,1 0,2"|LC_NUMERIC=fr_FR.UTF-8 awk --use-lc-numeric '{print $1+$2}'
0,3
non c'è bisogno di usare || 1, 'awk 'gsub (/\./, "")' – ghostdog74
@ ghostdog74 'gsub' restituisce il numero di sostituzioni, la versione salta linee che non contenere almeno un punto. Non so abbastanza dei dati di input dell'OP per omettere '|| 1'. – schot