[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Wieder mal awk



Hallo Leute,

wieder beschäftige ich mich mit awk doch habe ich dieses mal ein
performace-Problem.

Ein kurzes awk-Script prüft eine beliebige Spalte einer Tabelle ob die
darin enthaltenen Werte zwischen zwei Grenzen liegen. Wenn ja, soll der
entsprechende Wert einer bestimmten anderen Spalte aufsummiert werden.

Das ganze sieht so aus:

--- awk file start ---
$(column) >= lower_boarder && $(column) < upper_boarder { sum += $6 }

END { print sum }
--- awk file end ---

Aufgerufen wird es so:

awk -v lower_boarder=... -v upper_boarder=... -v column=... -v sum=0 -f
script.awk tabelle.csv

An sich ist das jetzt kein Problem, ich bekomme ein Ergebnis. Aber
leider muß ich diesen Vorgang ein paar tausend mal anstoßen da
verschiedene Ober- und Untergrenzen zu betrachten sind.

Die Anzahl der Grenzen werden in der Art berechnet als das das größte
Delta zweier Werte der Spalte $(column) in eine beliebige Schrittweite
(Step) aufgeteilt wird.

Ein kleines Bsp.:

# |  $6|$(column)
--+----+---------
1 |12,1|        1
2 | 2,5|        6
3 |11,3|        4
4 | 3,1|        9
5 | 2,9|        7

Sei Min.=1 und Max=9 wie aus $(column) hervorgeht. Somit ist die max.
Schrittweite <= 9-1 = 8.
Sei die Schrittweite = 5. Dann ergeben sich folgende Filter(Intervalle):
Filter: [1,6[ und [6,11[

Filter [1,6[ ergibt (siehe obiges Script):
12,1 + 11,3 = 23,4
Filter [6,11[ ergibt:
2,5 + 3,1 + 2,9 = 8,5

Die neue Tabelle sei damit

# |  Step  | Sum
--+--------+-----
1 | [1,6[  | 23,4
2 | [6,11[ |  8,5

Ich hoffe es war halbwegs verständlich :-) Momentan habe ich die Lösung
mit einen Bash-Script erledigt welches obige awk-Script für jedes neue
Grenzen-Paar einmal aufruft. Das kann gerne 10^6 bis 10^7 mal der Fall
sein. Und bei 2,5*10^5 Zeilen macht das dann eine Sekunde pro Spalte der
neuen Tabelle. Ich hoffe echt jemand weiß Rat. Die gängigen
wissenschaftl. Tabellenkalkulationsprogramme decken den o.g. Fall nur
sehr schlecht ab.

Besten Dank!

Goran



Reply to: