PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schleifenprozess mit awk mit Variablenübergabe



M. Quad
12-04-2005, 21:36
Hallo liebe Leute,

ich versuche seit längerer Zeit eine etwas elegantere Lösung für mein Problem zu erstellen. Leider bin ich dabei nicht erfolgreich gewesen und könnte Hilfe gebrauchen.

Problemstellung:
Ein Tool wertet mir eine Reihe von Dateien aus und schreibt diese nach und nach in eine einzige Datei. Der Inhalt der Dateien ist dabei grundsätzlich, bis auf die erste Spalte, unterschiedlich. Damit ist gemeint, dass sich die Werte der ersten Spalte regelmässig wiederholen.

Beispiel: Quelldatei
Spalte 1 Spalte 2 Spalte 3 Spalte 4
2354-----444------555------666
3456-----777------888------999
5432-----1000-----323------645
...
2354-----111------222------333
3456-----123 -----234------345
5432-----1205-----456------567
...

Das von mir angestrebte awk Skript soll die Quelldatei so analysieren, dass immer die Zeile komplett ausgeschrieben wird, in der sich in Spalte 2 das Maximum befindet - ! Allerdings ! - in Abhänigkeit von der Spalte 1.
Das soll bedeuten; die Zieldatei soll folgendes Ergebnis aufweisen:

Zieldatei
Spalte 1 Spalte 2 Spalte 3 Spalte 4
2354-----444------555------666
3456-----777------888------999
5432-----1205-----456------567

Ziel: Für jeden Wert in Spalte 1 soll einmalig das Maximum in Spalte 2 ermittelt werden.

Mein bisheriges Skript ähnelt eher einem Batchkkommando mit furchtbar vielen Aufrufen, da ich die Quelldatei erst noch sortiert und geteilt habe um dann das Maximum zu bestimmen und um letztendlich wieder alles zusammen zu fahren. Leider sind mir die meisten Beispiele etwas zu kryptisch, als das ich diese sofort verstehe.

Für eine Idee oder Hilfestellung wäre ich Euch sehr dankbar.

MFG m.quad

Jasper
12-04-2005, 21:57
$ cat bla
2354-----444------555------666
3456-----777------888------999
5432-----1000-----323------645
2354-----111------222------333
3456-----123 -----234------345
5432-----1205-----456------567

$ sort -nr bla | awk -F"-" '{if(I != $1) {print $0; I=$1}}'
5432-----1205-----456------567
3456-----777------888------999
2354-----444------555------666


-j

M. Quad
13-04-2005, 13:28
Hallo Jasper,

vielen Dank für die schnelle Antwort. Ich habe allerdings noch ein weiteres Problemchen.

Quelldatei: Beispiel
1 2 3
2 -3 4
3 4 5
1 -3 8
2 4 1
3 -5 4
1 4 6
2 5 4
3 7 9
1 1 3
2 -4 5
3 6 6

Kommando
sort -r BEISPIEL | awk '{if(I != $1) {print $0; I=$1}}' > BEISPIEL_01

Ergebnis: bisher

3 7 9
2 5 4
1 4 6

Ergebnis: alternativ gewünscht

1 -3 8
2 -4 5
3 -5 4

Mein Ziel wäre jedoch auch, nach dem Minimum in der zweiten Spalte zu suchen. Habe jetzt schon ein paar Möglichkeiten versucht, aber ausser Blödsinn ist dabei nicht herumgekommen.

Wie kann man die if Bedingung umformulieren?

Danke nochmals.