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

Creating new column with arithmetic only if first column has same ID using awk

如果我有一个格式如下的文件:

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

我想添加第三列,它使用相邻行中 Value2 的差异,并将其乘以具有相同 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{=((-p)*(q))} {p=} {q=} 1' input> output

但这会影响 ID 的更改:

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 -v OFS='\t' 'NR == 1 {print [=10=], "Calculated"; next} {print [=10=], (NR>2 && p1 ==  ? (-p3)*p2 : "")} {p1 = ; p2 = ; p3 = }' file

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 -v OFS='\t' 'NR == 1 {
   print [=11=], "Calculated"
   next
}
{
   print [=11=], (NR > 2 && p1 ==  ? ( - p3) * p2 : "")
}
{
   p1 = 
   p2 = 
   p3 = 
}' file