2016-06-17 12 views
2

Ich bekomme das richtige Ergebnis für das awk-Programm unten. Aber ich verstehe nicht, wie funktioniert AWK Prozess Codezeilen für das folgende Programm:AWK, wie Datensätze und Felder ausgeführt werden und lesen

{ 
    for(i = 1; i <= NF; i++) 
    { 
    if (min[i]==""){ print "initial min " $i; min[i]=$i;} #line1 
    if (max[i]==""){ print "initial max " $i; max[i]=$i;} #line2 
    if ($i<min[i]) { print "New min " $i; min[i]=$i;}  #line3 
    if ($i>max[i]) { print "New max " $i; max[i]=$i;}  #line4 
    } 
} 
END 
{ 
    OFS="\t"; 
    print "min","max"; 
    for(i = 1; i <= NF; i++) 
    { 
    print min[i],max[i]; 
    }  
} 

Datasetfelder getrennt verwendet Raum

0.4 1.4 2.4 3.4 
0.3 1.3 2.3 3.3 
0.1 1.1 2.1 3.1 
0.2 1.2 2.2 3.2 
0.5 1.5 2.5 3.5 

Ausgabe

initial min 0.4 
initial max 0.4 
initial min 1.4 
initial max 1.4 
initial min 2.4 
initial max 2.4 
initial min 3.4 
initial max 3.4 
New min 0.3 
New min 1.3 
New min 2.3 
New min 3.3 
New min 0.1 
New min 1.1 
New min 2.1 
New min 3.1 
New max 0.5 
New max 1.5 
New max 2.5 
New max 3.5 

min max 
0.1 0.5 
1.1 1.5 
2.1 2.5 
3.1 3.5 

Linie 1 und 2 gedruckt alternativ (also initial min und max) Aber Zeile 3 und Zeile 4 werden nach dem Setzen neuer Min oder Max für alle Felder (oder Spalten) ausgeführt. Wie funktioniert awk wirklich?

+1

'{}' Blöcke ausgeführt. Der Endblock wird nur ausgeführt, wenn alle Zeilen bearbeitet wurden. – 123

+0

Aber wenn Sie in der oberen Zeile beobachten, werden Zeile 1 und Zeile 2 alternativ für jeden Datensatz ausgeführt. min max für jedes Feld wird nacheinander eingestellt, anstatt zuerst min für alle Felder zu setzen und dann max für alle Felder zu setzen. –

+1

Das passiert gar nicht, jedes 'if' läuft auf jedem Feld jeder Zeile. – 123

Antwort

3

ich bearbeitet Ihren Code in:

{ 
    for(i = 1; i <= NF; i++) 
    { 
    if (min[i]==""){ print "initial min["i"] " $i; min[i]=$i;} #line1 
    if (max[i]==""){ print "initial max["i"] " $i; max[i]=$i;} #line2 
    if ($i<min[i]) { print "New min["i"] " $i; min[i]=$i;}  #line3 
    if ($i>max[i]) { print "New max["i"] " $i; max[i]=$i;}  #line4 
    } 
} 
END { 
    OFS="\t"; 
    print "min","max"; 
    for(i = 1; i <= NF; i++) 
    { 
    print min[i],max[i]; 
    }  
} 

nun mit seinem Ausgang sollten Sie verstehen, was passiert: in jeder Zeile sind standardmäßig

initial min[1] 0.3 
initial max[1] 0.3 
initial min[2] 3.3 
initial max[2] 3.3 
initial min[3] 0.5 
initial max[3] 0.5 
initial min[4] 3.6 
initial max[4] 3.6 
New max[1] 0.9 
New max[2] 4.7 
New max[3] 2.5 
New min[4] 1.6 
New min[1] 0.2 
New min[2] 2.7 
New max[3] 6.3 
New max[4] 9.3 
New min[2] 1.6 
New max[3] 8.9 
min  max 
0.2  0.9 
1.6  4.7 
0.5  8.9 
1.6  9.3 
+0

Danke, ich sehe, was wirklich passiert. –