AWK 如何执行和读取记录和字段
AWK how records and fields are executed and read
下面的 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];
}
}
数据集字段使用 space
分隔
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
第1行和第2行交替打印(即初始最小值和最大值)但是第3行和第4行是在为所有字段(或列)设置新的最小值或最大值后执行的 那么awk到底是如何工作的呢?
我将您的代码编辑为:
{
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
下面的 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];
}
}
数据集字段使用 space
分隔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
第1行和第2行交替打印(即初始最小值和最大值)但是第3行和第4行是在为所有字段(或列)设置新的最小值或最大值后执行的 那么awk到底是如何工作的呢?
我将您的代码编辑为:
{
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