Unix 仅当第一列使用awk具有相同ID时,才使用算术创建新列

Unix 仅当第一列使用awk具有相同ID时,才使用算术创建新列,unix,awk,calculated-columns,Unix,Awk,Calculated Columns,如果我有以下格式的文件: ID Temp Time 0 1 0.1 0 2 0.2 0 1 0.3 0 2 0.4 1 1 0.1 1 2 0.2 1 2 0.4 1 3 0.6 我想添加第三列,该列使用相邻行中的值2的差值,并将其乘以具有相同ID的行的值1,因此预期输出为: ID Temp Time Calculated 0 1 0.1 0 2 0.2

如果我有以下格式的文件:

ID Temp   Time
0  1      0.1
0  2      0.2
0  1      0.3
0  2      0.4
1  1      0.1
1  2      0.2
1  2      0.4
1  3      0.6
我想添加第三列,该列使用相邻行中的值2的差值,并将其乘以具有相同ID的行的值1,因此预期输出为:

ID Temp   Time   Calculated
0  1      0.1    
0  2      0.2    0.1
0  1      0.3    0.2
0  2      0.4    0.1
1  1      0.1    
1  2      0.2    0.1
1  2      0.4    0.4
1  3      0.6    0.4
我几乎可以通过代码获得:

awk 'NR>1{$4=(($3-p)*(q))} {p=$3} {q=$2} 1' input> output
但这涉及到身份证发放的变化:

ID Temp   Time   Calculated
0  1      0.1    
0  2      0.2    0.1
0  1      0.3    0.2
0  2      0.4    0.1
1  1      0.1    -0.6
1  2      0.2    0.1
1  2      0.4    0.4
1  3      0.6    0.4

除了每次ID更改时都应该重新启动而不继续外,是否有办法将其添加到awk?

您可以使用此
awk

awk-vofs='\t''NR==1{print$0,“已计算”;next}{print$0,(NR>2&&p1==1?($3-p3)*p2:)}{p1=$1;p2=$2;p3=$3}文件
计算的ID温度时间
0  1      0.1
0  2      0.2   0.1
0  1      0.3   0.2
0  2      0.4   0.1
1  1      0.1
1  2      0.2   0.1
1  2      0.4   0.4
1  3      0.6   0.4
要使其更具可读性,请执行以下操作:

awk-v OFS='\t''NR==1{
打印$0,“已计算”
下一个
}
{
打印$0,(NR>2&&p1==1?($3-p3)*p2:)
}
{
p1=1美元
p2=2美元
p3=3美元
}"档案"

对于您的示例输入,具有相同ID的行的
值1是多少?描述有点含糊不清…@vgersh99不同的ID号在不同的位置,Value1是温度,Value2是测量时间-因此Value1可以是任何正数。这仍然不清楚。同样,您的示例输入文件的“乘数”应该是什么?@user15006570:您能解释一下为什么最后一行的新值是
0.4
,而不是
0.6
?@anubhava(0.6-0.4)*(2)=0.4或(当前时间-上一次)*(上一次温度)。计算公式运行良好,问题是一旦ID发生变化,它需要重新启动,因为我们现在处于一个新的点,或者可能以某种方式在ID上循环?我是unix新手。这太完美了。谢谢!