Stampa di mille carri separati con GAWK
-
09-09-2019 - |
Domanda
devo elaborare alcuni file di enorme con gawk. Il mio problema principale è che devo stampare alcuni carri mediante separatori delle migliaia. Es .: 10000
dovrebbe apparire come 10.000
e 10000,01
come 10.000,01
nell'output.
I (e Google) vengo con questa funzione, ma non è così per i galleggianti:
function commas(n) {
gsub(/,/,"",n)
point = index(n,".") - 1
if (point < 0) point = length(n)
while (point > 3) {
point -= 3
n = substr(n,1,point)"."substr(n,point + 1)
}
sub(/-\./,"-",n)
return d n
}
Ma non riesce con i galleggianti.
Ora sto pensando di dividere l'input per un intero e un <1 parte, poi, dopo la formattazione il numero intero incollandoli nuovo, ma non c'è un modo migliore per farlo?
Avviso:
- Io non sono un programmatore
- so che attraverso qualche SHELL env. variabili i separatori delle migliaia possono essere impostati, ma devono funzionare in diversi ambienti con differenti impostazioni locali lang e / o.
- English è la mia seconda lingua, scusate se sto usando in modo errato
Soluzione
Non riesce con i galleggianti, perché si sta passando numeri di tipo europeo (1.000.000,25 per un milione e un quarto). La funzione che hai dato dovrebbe funzionare solo se si cambiano nel virgole e punti. Mi piacerebbe provare la versione corrente prima con 1.000.000,25 per vedere se funziona con i numeri non europei.
Il seguente script awk può essere chiamato con "echo 1 | awk -f xx.gawk"
e vi mostrerà sia la "normale" e la versione europea in azione. Produce:
123,456,789.1234
123.456.789,1234
Ovviamente, siete interessati solo le funzioni, il codice del mondo reale sarebbe utilizzare il flusso di ingresso per passare i valori alle funzioni, non una stringa fissa.
function commas(n) {
gsub(/,/,"",n)
point = index(n,".") - 1
if (point < 0) point = length(n)
while (point > 3) {
point -= 3
n = substr(n,1,point)","substr(n,point + 1)
}
return n
}
function commaseuro(n) {
gsub(/\./,"",n)
point = index(n,",") - 1
if (point < 0) point = length(n)
while (point > 3) {
point -= 3
n = substr(n,1,point)"."substr(n,point + 1)
}
return n
}
{ print commas("1234,56789.1234") "\n" commaseuro("12.3456789,1234") }
Le funzioni sono identiche tranne che nella loro gestione di virgole e punti. Li chiameremo separatori e decimali nella seguente descrizione:
- gsub rimuove tutti i separatori esistenti poiché noi li metteremo di nuovo.
- punto trova in cui il decimale è da allora che è il nostro punto di partenza.
- se non c'è decimale, il se-dichiarazione inizia alla fine.
- abbiamo ciclo while c'è più di tre caratteri a sinistra.
- all'interno del ciclo, abbiamo regolare la posizione per l'inserimento di un separatore, e inserirlo.
- una volta che il ciclo è finito, si torna al valore impostato.
Altri suggerimenti
Per andare con di Pax risposta :
la sezione "Conversione" del GNU awk manuale , che parla in modo esplicito circa l'effetto della variabile d'ambiente LOCALE
sulla rappresentazione di stringa di tipi numerici.