[gelöst]gawk und rechnen im Skript

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
halo44
Beiträge: 703
Registriert: 12.05.2015 15:19:13

[gelöst]gawk und rechnen im Skript

Beitrag von halo44 » 16.03.2018 11:33:38

Ich tue mich etwas schwer dabei das Rechenergebnis folgender Operation zu verstehen:

Eine csv-Datei folgenden Inhalts

Code: Alles auswählen

15.03.2018;UMBUCHUNG;"10000,00";"";"";'KONTO'
in einem Skript übergeben an gawk liefert mir nicht das erwartete Ergebnis

Code: Alles auswählen

#!/bin/sh
#
read Vsaldo  # hier übergebe ich im Terminal den Wert 408.59
#
cat AUS_py.csv | gawk -v sum=$Vsaldo -F ";" '{OFS=";"} \
{sub(",", ".", $3)} {gsub("\"", "")} \
{print substr($1,1,10), substr($2,1,32), substr($3,1,10), sum+=$3}' > arb-umsatz.csv
In der Datei arb-umsatz.csv finde ich jetzt:

Code: Alles auswählen

15.03.2018;UMBUCHUNG;10000.00;10408.6
Erwarten würde ich 10408.59.

Beträgt die Umbuchung statt 10000 nur 1000, dann erhalte ich das richtige Ergebnis 1408.59.

Leider finde ich nicht die richtigen Suchbegriffe um die Lösung im Netz zu finden. Ich vermute irgendwelche Defaulteinstellungen für das Zahlenformat der Eingabe für das Feld $3 in der Eingabedatei.

Für Hilfe bin ich dankbar.

Gruss H.
Zuletzt geändert von halo44 am 16.03.2018 13:20:58, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: gawk und rechnen im Skript

Beitrag von Meillo » 16.03.2018 12:01:39

Manpage von awk(1) hat geschrieben: When a string must be converted to a number, the conver‐
sion is accomplished using strtod(3). A number is con‐
verted to a string by using the value of CONVFMT as a
format string for sprintf(3), with the numeric value of
the variable as the argument. However, even though all
numbers in AWK are floating-point, integral values are
always converted as integers. Thus, given

CONVFMT = "%2.2f"
a = 12
b = a ""

the variable b has a string value of "12" and not
"12.00".
Setze also mal CONVFMT auf z.B. "%.2f" und schaue was dann passiert.

Oder formatiere den Wert direkt, indem du statt ``sum+=$3'' ``sprintf("%.2f", sum+=$3)'' schreibst.

Vielleicht hilft das weiter.


Btw: In deiner Eingabe-CSV-Datei fehlt die zweite Zeile mit den 408.59.
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: gawk und rechnen im Skript

Beitrag von Meillo » 16.03.2018 12:11:42

Oh ... das scheint eher ein Problem des Float-Datentyps zu sein:

Code: Alles auswählen

:-Q awk 'BEGIN{ CONVFMT="%.2f"; print 408.59 + 1000; }' 
1408.59

:-Q awk 'BEGIN{ CONVFMT="%.2f"; print 408.59 + 10000; }'
10408.6

:-Q awk 'BEGIN{ CONVFMT="%.2f"; print 408.59 + 100000; }'
100409
Wenn du's exakt haben willst, dann verwende bc(1) mittels einem derartigen AWK-Code:

Code: Alles auswählen

"echo \"scale=2; " sum " + " $3 "\" | bc -q" | getline sum
Use ed once in a while!

halo44
Beiträge: 703
Registriert: 12.05.2015 15:19:13

Re: gawk und rechnen im Skript

Beitrag von halo44 » 16.03.2018 12:22:45

Meillo hat geschrieben: ↑ zum Beitrag ↑
16.03.2018 12:01:39
... Oder formatiere den Wert direkt, indem du statt ``sum+=$3'' ``sprintf("%.2f", sum+=$3)'' schreibst.

Vielleicht hilft das weiter ...
Danke, das hat geholfen.
Meillo hat geschrieben: ↑ zum Beitrag ↑
16.03.2018 12:01:39
Btw: In deiner Eingabe-CSV-Datei fehlt die zweite Zeile mit den 408.59.
Ich habe den Wert nicht im Skript übergeben, sondern im Terminalfenster, in dem das Skript lief, per Eingabe mit read:

Code: Alles auswählen

read Vsaldo  # hier übergebe ich im Terminal den Wert 408.59
Gruss H.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: gawk und rechnen im Skript

Beitrag von Meillo » 16.03.2018 15:27:30

halo44 hat geschrieben: ↑ zum Beitrag ↑
16.03.2018 12:22:45
Meillo hat geschrieben: ↑ zum Beitrag ↑
16.03.2018 12:01:39
Btw: In deiner Eingabe-CSV-Datei fehlt die zweite Zeile mit den 408.59.
Ich habe den Wert nicht im Skript übergeben, sondern im Terminalfenster, in dem das Skript lief, per Eingabe mit read:

Code: Alles auswählen

read Vsaldo  # hier übergebe ich im Terminal den Wert 408.59
Stimmt, hab ich uebersehen.
Use ed once in a while!

Antworten