【发布时间】:2016-10-19 09:56:27
【问题描述】:
我得到了下面 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];
}
}
数据集字段使用空格分隔
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 到底是如何工作的呢?
【问题讨论】:
-
{}块默认在每一行执行。结束块仅在所有行都被处理后执行。 -
但是如果你在最上面观察到第 1 行和第 2 行对每条记录交替执行。每个字段的最小值最大值是依次设置的,而不是先设置所有字段的最小值,然后再设置所有字段的最大值。
-
根本不是这样,每个
if运行在每一行的每个字段上。 -
第一个
for循环的主体是针对record-1,column-1,然后针对record-1,column-2执行的;记录 1,第 3 列;记录 1,第 4 列; record-2、column-1、record-2、column-2 等,与输出中看到的完全相同。也许如果您在诊断输出中包含NR(正在处理的当前记录)和i(正在查看的当前列),它会更清晰。 -
改用
print "initial min["i"] " $i和print "initial max["i"] " $i你自己就明白了
标签: bash awk text-processing gawk