AWK:根据上一行的值增加一个字段
AWK: increment a field based on values from previous line
给定以下 AWK 输入:
10;20;20
8;41;41
15;52;52
我如何 increase/decrease 值以便:
- $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=
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
给定以下 AWK 输入:
10;20;20
8;41;41
15;52;52
我如何 increase/decrease 值以便:
- $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=
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