AWK:根据上一行的值增加一个字段

AWK: increment a field based on values from previous line

给定以下 AWK 输入:

10;20;20
8;41;41
15;52;52

我如何 increase/decrease 值以便:

所以期望的输出是:

10;20;20
8;31;31
15;40;40

我需要自动递增并遍历这些行, 使用关联数组,但这让我感到困惑。 当然,这不能按预期工作:

#!/bin/awk -f

BEGIN { FS = ";" }

{
print ln, st, of
ln=
st= + ln + 1
of= + ln + 1
}

以下 awk 可能会对您有所帮助。

awk -F";" '
FNR==1{
 val=;
 val1=;
 val2=;
 print;
 next
}
{
=val+val1+1;
=val+val2+1;
print;
val=;
val1=;
val2=;
}' OFS=";"   Input_file

对于给定的 Input_file,输出如下。

10;20;20
8;31;31
15;40;40
awk 'BEGIN{
           FS = OFS = ";"
     }
     FNR>1{
            = p2 + p1 + 1 
            = p3 + p1 + 1 
     }
     {
          p1=; p2=; p3=
     }1
    ' infile

输入:

$ cat infile
10;20;20
8;41;41
15;52;52

输出:

awk 'BEGIN{FS=OFS=";"}FNR>1{=p2+p1+1; =p3+p1+1 }{p1=; p2=; p3=}1' infile
10;20;20
8;31;31
15;40;40

或者只存储您感兴趣的字段

awk -v myfields="2,3" '
    BEGIN{
        FS=OFS=";";
        split(myfields,t,/,/)
    }
    {
        for(i in t)
        {
            if(FNR>1)
            {
                $(t[i]) = a[t[i]] + a[1] + 1    
            }

            a[t[i]] = $(t[i])
        }
            a[1] = 
    }1' infile

使用 awk

awk -F";" -v OFS=";" 
    'NR!=1{ =a[2]+a[1]+1; =a[3]+a[1]+1 } { split([=10=],a,FS) } 1' file

将行拆分为一个数组,在处理下一行时我们可以使用存储的值。

测试

10;20;20
8;31;31
15;40;40