首页 > 解决方案 > 打印以两个字段为条件的连续行并减去另一个字段

问题描述

如果它们具有匹配的第一场但在第三场中具有相反的信号,我想打印连续的行。然后计算连续行的第二个字段之间的距离。

输入:

id1 pos1 0.19
id1 pos2 0.33
id1 pos3 -0.25
id1 pos4 -0.22
id2 pos5 0.33
id3 pos6 -0.21
id3 pos7 -0.56
id3 pos8 -0.20
id3 pos9 0.33
id3 pos10 -0.32

中间输出:

id1 pos2 0.33
id1 pos3 -0.25
id3 pos8 -0.20
id3 pos9 0.33
id3 pos10 -0.32

期望的输出:

id1 pos3-pos2
id3 pos9-pos8
id3 pos10-pos9

我发现比较连续行的类似问题,但没有一个可以用来回答我的问题。

到目前为止,我尝试过:

awk '$1==prev1{$NF=$2-prev2;print $1,$NF} {prev2=$2;prev1=$1}'

但我不知道如何添加第三场的条件必须有相反的信号。

标签: awkfieldlinematching

解决方案


请您尝试以下操作。

awk '
prev!=$1{
  prev_val=prev=""
}
prev==$1{
  if(($NF~/^-/ && prev_val!~/^-/) || ($NF!~/^-/ && prev_val~/^-/)){
     print $1,$2,$NF-prev_val
  }
}
{
  prev=$1
  prev_val=$NF
}
'  Input_file

推荐阅读