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
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top