【问题标题】:AWK how records and fields are executed and readAWK 如何执行和读取记录和字段
【发布时间】: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"] " $iprint "initial max["i"] " $i你自己就明白了

标签: bash awk text-processing gawk


【解决方案1】:

我将您的代码编辑为:

{
    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

【讨论】:

  • 谢谢,我明白到底发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-11
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多