Frage

Ich muss einige große Datei mit gawk verarbeiten. Mein Hauptproblem ist, dass ich einige Floats mit Tausendertrennzeichen drucken haben. Z.B .: 10000 als 10.000 und 10000,01 als 10.000,01 in der Ausgabe erscheinen soll.

I (und Google) kommen mit dieser Funktion, aber diese nicht für Schwimmer:

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
}

Aber es scheitert mit Schwimmern.

Jetzt von Ich denke, die Eingabe auf eine ganze Zahl Aufspalten und <1 Teil, dann nach der Integer-Formatierung sie wieder Kleben, aber nicht es ein besserer Weg, es zu tun?

Hinweis:

  • Ich bin kein Programmierer
  • Ich weiß, dass über einige SHELL env. Variablen die Tausendertrennzeichen gesetzt werden können, aber es muss in verschiedenen Umgebungen mit unterschiedlichen lang und / oder lokalen Einstellungen arbeiten.
  • Englisch ist meine zweite Sprache, sorry, wenn ich es falsch bin mit
War es hilfreich?

Lösung

Es scheitert mit Schwimmern, weil Sie in der europäischen Typnummern vorbei sind (1.000.000,25 für eine Million und ein Viertel). Die Funktion, die Sie gegeben haben sollte funktionieren, wenn Sie nur über Kommas und Punkte ändern. Ich würde die aktuelle Version testet zuerst mit 1.000.000,25 zu sehen, ob es mit nicht-europäischen Zahlen funktioniert.

Der folgende awk-Skript kann mit "echo 1 | awk -f xx.gawk" genannt werden, und es wird Ihnen sowohl die „normale“ und europäische Version in Aktion. Es gibt:

123,456,789.1234
123.456.789,1234

Offensichtlich Sie in den Funktionen nur interessiert sind, reale Welt Code würde den Eingangsstrom verwenden, um Werte an die Funktionen übergibt, nicht eine feste Zeichenfolge.

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") }

Die Funktionen sind identisch mit Ausnahme im Umgang mit Kommas und Punkte. Wir werden sie Separatoren und Dezimalzahlen in der folgenden Beschreibung aufrufen:

  • gsub entfernt alle vorhandenen Separatoren, da wir sie setzen wieder werde.
  • Stelle findet, wo das Dezimalsystem da ist, dass unser Ausgangspunkt ist.
  • , wenn es keine Dezimalzahl ist, die if-Anweisung beginnt am Ende.
  • wir Schleife, während es mehr als drei Zeichen zur Verfügung.
  • innerhalb der Schleife, passen wir die Position für ein Trennzeichen eingefügt, und legen Sie es.
  • , sobald die Schleife beendet ist, kehren wir den eingestellten Wert.

Andere Tipps

Pax Antwort gehen:

Lesen Sie der "Umwandlung" der GNU awk Handbuch das spricht ausdrücklich über die Wirkung Ihres LOCALE Umgebungsvariable auf der String-Darstellung von numerischen Typen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top