2016-06-20 10 views
-1

Ich habe drei Felder in Dataset-Datei.Finden Min Werte in Feld 2 durch das Durchschleifen bestimmter Datensätze mit AWK

Feld 1 als ID

Feld wird verwendet, um die 2 min 3 ist

Feld boolean entweder 0 oder 1

I 2 min den Wert im Feld zu finden, muss zu vergleichen, sondern mit Bezug auf Feld 1. das ist, betrachten Sie unter Datensatz.

-Datensatz

1 0.432 0 
1 0.12 1 
1 0.298 0 
2 0.056 0 
2 0.06 1 
3 0.982 0 

I die Werte im Feld 2 für die ersten 3 Datensätze vergleichen müssen und prüfen, ob Feld 3 Wert = 1 für den Minimalwert in Feld so 2. Wenn hat, ++ Zählung.

Dann finden min wieder in Feld 2, aber für Datensätze mit Feld 1 = 2. Das heißt, nur Rekord 4 und 5.Und so weiter ...

Was wäre der beste Weg, um mit ihm zu gehen über ? Die Datei enthält ca. 2.000.000 Datensätze.

Ist es möglich, Feld 2 zu sortieren und dann einen Datensatz für jeden anderen Wert von Feld1 zu nehmen?

Antwort

1

die einfachste ...

$ sort -n file | awk '!a[$1]++' 

1 0.12 1 
2 0.056 0 
3 0.982 0 

die Summe

$ sort -n file | awk '!a[$1]++{sum+=$3} END{print sum}' 
1 
jedoch

zu zählen, wenn es eine Übereinstimmung im Feld zwei ist, und Sie mögen den Datensatz mit letztem Feld, das Sie 1 holen haben Art zu umkehren für Feld 3, das heißt sort -k1,2n -k3r

Erklärung

!a[$1]++ ist ein awk Idiom den ersten eindeutigen Eintrag für das Feld 1. Erstellen eines Zählers mit Schlüssel zugeordnet auszuwählen, wird logisch wahr sein nur für den ersten Eintrag (aufgrund der Negation und die automatische Konvertierung von Werten boolean)

Sortierung: die ersten beiden Felder in aufsteigender Reihenfolge (aber nummeriert so 2 < 11), dritte ist in absteigender Reihenfolge (rückwärts), so dass 1 vor 0 erscheint. Da das letzte Feld nur eine Ziffer ist, spielt numerische Sortierung oder lexikalische Sortierung keine Rolle. Ansonsten möchten Sie, dass es auch numerisch ist.

+0

Können Sie den Code '! A [$ 1] ++' erklären? Ich bekomme diesen Teil nicht. –

+0

Bitte erklären Sie auch sort-k1 2n-k3r. Ich googelte und es scheint -k1 ist das Feld, das wir zum Sortieren verwenden, -k3r ist das Feld, das wir in umgekehrter Reihenfolge sortieren. Aber könnten Sie es erklären? zu viele Dinge geschehen gleichzeitig. –

+0

Der beste Weg, dies zu lernen, besteht darin, verschiedene Flags in einfachen Dateien zu testen. – karakfa