仅当第一列使用 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
如果我有一个格式如下的文件:
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