• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> 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.
 

Xardas

Luxemburger Triumph
Registriert
23.06.06
Beiträge
497
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

commune10

Adams Apfel
Registriert
11.08.11
Beiträge
522
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.