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新手。这太完美了。谢谢!