【问题标题】:print consecutive lines conditional on two fields and substract another fied打印以两个字段为条件的连续行并减去另一个字段
【发布时间】:2019-08-06 10:36:49
【问题描述】:

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

输入:

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}'

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

【问题讨论】:

  • 为什么这个输出 id3 pos8 -0.20 之前是 id3 pos7 -0.56 也是一个负值?通过相反的信号,你会从 + 到 - 吗?
  • 如果第一个字段与上一行相同(相同的 id)并且上一行的第三个字段值为负但当前行为正(或反之亦然),则减去上一行的字段 2从当前行开始。 (字段 2 是位置)
  • 我更新了我的帖子。它现在查看在同一 ID 内从 + 到 - 以及从 - 到 + 的变化

标签: awk field line matching


【解决方案1】:

请您尝试关注一下。

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

【讨论】:

  • 我想减去字段 2 而不是字段 4。
  • @AEC,抱歉没听明白,代码中没有提到字段4,$NF表示该行的最后一个字段。
  • 对不起,我想说的是 field3 而不是 field4。在您的情况下,我不想减去 $NF,而是减去 $2。但是我已经知道怎么做,和你上面的代码很相似。
  • @AEC,我不明白,您的示例显示 $3(第三字段)如果您的 Input_file 没有它,您可以尝试更改一次然后让我知道。
【解决方案2】:

根据您的描述,awk 应该这样做:

awk '{sc=$3~/^-/?0:1} $1==p1&&sp!=sc {print $1,($3-p3)} {sp=sc;p1=$1;p3=$3}' file
id1 -0.58
id3 0.53
id3 -0.65

sc=$3~/^-/?0:1 测试值是正值1 还是负值0
$1==p1&&sp!=sc 如果当前 ID 等于前一个 ID 和值变化符号,
print $1,($3-p3) 打印 ID 和当前和之间的差异上一个值。
sp=sc;p1=$1;p3=$3 设置上一个:sp 到 sc,p1 到 $1,p3 到 $3

【讨论】:

    【解决方案3】:
    awk  'prev1!=$1{
      prev3=prev2=prev1=""
    }
    prev1==$1{
      if(($3~/^-/ && prev3!~/^-/) || ($3!~/^-/ && prev3~/^-/)){
         print $1,$2-prev2
      }
    }
    {
      prev1=$1
      prev2=$2
      prev3=$3
    }
    '  Input
    

    这是我的问题的答案。感谢大家帮助我。

    【讨论】:

    • 您可以通过添加这个来编辑我的答案 ++ 也可以选择正确的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多