• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

Seltsames Problem mit Shellscript oder awk

commune10

Adams Apfel
Registriert
11.08.11
Beiträge
522
Ich habe folgende Datendatei ($IN):

2252
56
58,6
4 zbc cb -20,5
5 efg xy -35
5 hi jk lm 500,5
7 nopq -2,1​

Die ersten drei Zeilen enthalten nur jeweils eine Zahl. Danach folgen beliebig viele Zeilen mit drei Spalten.
  • Die erste enthält eine Zahl,
  • die zweite etwas Text
  • und die dritte wieder ein Zahl. Die Spalten sind per <TAB> getrennt.


Die Variable UE enthält die Zahl aus der dritten Zeile. Im Shellscript mache ich zunächst folgendes.

Code:
echo "" | awk -v ue=$UE ' { printf "Start\t\t---\t%.2f\n", ue } ' > out

Das ergibt: "Start<TAB><TAB>---<TAB>58,60\n"

Jetzt füge ich die weiteren Zeilen mit den Spalten hinzu, was immer funktioniert, außer bei der Zeile mit der "4" am Anfang. Hier verschwindet ein Stück der Textspalte und die -20,5 werden zu 0,00. Ansonsten ist alles richtig.

Code:
tail +4 $IN | awk -v sum=$UE ' FS="\t" { sum+=$3; printf "%.f.\t%s\t%.2f\t%.2f\n", $1, $2, $3, sum } END { printf "Ende\t\t---\t%.2f\n", sum } ' >> out

So schaut das Ergebnis aus:

Code:
Start		---	58,60
4.	zbc	0,00	58,60
5.	efg xy	-35,00	23,60
5.	hi jk lm	500,50	524,10
7.	nopq	-2,10	522,00
Ende		---	522,00

Das Problem ist also dort wo "zbc" und "0,00" steht. Sieht jemand den Fehler, ich bin schon total betriebsblind.
 
Ich habe es mal unter Linux ausprobiert, und hier lässt sich das (vermutlich) gewünschte Verhalten herstellen, indem der Teil mit der Zuweisung zu FS in die Parameterübergabe verlagert wird. Ich mache es immer per Parameter, und weiß nicht, ob das unter Mac OS X anders geregelt ist bzw. ob es da generell Ausnahmen zu beachten gibt.

Der Aufruf würde also wie folgend aussehen, Änderung hervorgehoben:

Code:
tail +4 $IN | awk -v sum=$UE [B]-F '\t' [/B]'{ sum+=$3; printf "%.f.\t%s\t%.2f\t%.2f\n", $1, $2, $3, sum } END { printf "Ende\t\t---\t%.2f\n", sum } ' >> out

... und führt dann zu dieser (Teil-)Ausgabe (Kommata durch Punkte ersetzt)

Code:
4.    zbc cb    -20.50    38.10
5.    efg xy    -35.00    3.10
5.    hi jk lm    500.50    503.60
7.    nopq    -2.10    501.50
Ende        ---    501.50
 
  • Like
Reaktionen: commune10
Bestens, vielen Dank, so funktioniert es.

Code:
echo "" | awk -v ue=$UE ' { printf "Start\t\t---\t%.2f\n", ue } ' > $TAB # echo -e "Start\t\t---\t"$UE > out
tail +4 $IN | awk -v sum=$UE -F '\t' ' { sum+=$3; printf "%.f.\t%s\t%.2f\t%.2f\n", $1, $2, $3, sum } END { printf "Ende\t\t---\t%.2f\n", sum } ' >> out

Ich glaub, ich habe da schon zu lang draufgeguckt, um den Fehler noch zu erkennen.