AWK:根据前一行的值递增字段

时间:2017-11-16 12:13:52

标签: bash awk sh auto-increment

给出AWK的以下输入:

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

我如何增加/减少值,以便:

  • $ 1 =保持不变
  • $ 2 =前一行的$ 2 +前一行的$ 1 + 1
  • $ 3 =前一行的$ 3 +前一行的$ 1 + 1

所以期望的输出是:

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

我需要自动递增并循环遍历线条, 使用关联数组,但它让我感到困惑。 当然,这并没有按照要求运作:

#!/bin/awk -f

BEGIN { FS = ";" }

{
print ln, st, of
ln=$1
st=$2 + ln + 1
of=$3 + ln + 1
}

3 个答案:

答案 0 :(得分:1)

关注awk可能对您有帮助。

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

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

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

答案 1 :(得分:1)

awk 'BEGIN{
           FS = OFS = ";"
     }
     FNR>1{
           $2 = p2 + p1 + 1 
           $3 = p3 + p1 + 1 
     }
     {
          p1=$1; p2=$2; p3=$3
     }1
    ' infile

输入:

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

输出:

awk 'BEGIN{FS=OFS=";"}FNR>1{$2=p2+p1+1; $3=p3+p1+1 }{p1=$1; p2=$2; p3=$3}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
    }1' infile

答案 2 :(得分:0)

使用awk

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

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

测试

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