2016-06-17 9 views
2

以下のawkプログラムで正しい結果が得られました。AWKレコードとフィールドの実行方法と読み込み方法

{ 
    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]; 
    }  
} 

データセットのフィールドは、1行目と2が印刷されているスペース

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 

出力

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 

を用いて分離されています。しかし、私は、以下のプログラムのためのコードのAWKプロセスラインが行う方法を理解してはいけません代わりに(つまり、最初の最小値と最大値)しかし、3行目と4行目はすべてのフィールド(または列)のMin MinまたはMaxを設定した後に実行されます。

+1

'{}'ブロックは、デフォルトではすべての行で実行されています。終了ブロックは、すべての行が処理されたときにのみ実行されます。 – 123

+0

しかし、1行目と2行目を観察すると、レコードごとに交互に実行されます。各フィールドの最小値は、最初にすべてのフィールドのminを設定してから、すべてのフィールドにmaxを設定するのではなく、1つずつ設定されます。 –

+1

これはまったく起こりません。すべての 'if'はすべての行のすべてのフィールドで実行されます。 – 123

答えて

3

私はにあなたのコードを編集した:その出力であなたは何が起こるかを理解する必要があり、

{ 
    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]; 
    }  
} 

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

ありがとう、本当に起こっていることが分かります。 –

関連する問題