【问题标题】:subtract from the previous line从上一行减去
【发布时间】:2020-02-03 19:24:20
【问题描述】:

我正在尝试从第二列中的当前组行中减去前一个组行。例如,以下脚本重复了 100 次。

A   
322 0.2
322 0.2
322 0.2
B   
455 0.35
455 0.35
455 0.35
C   
566 0.92
566 0.92
566 0.92

A   
322 0.18
322 0.18
322 0.18
B   
455 0.33
455 0.33
455 0.33
C   
566 0.99
566 0.99
566 0.99

我希望起点是 A,这意味着第一组的 0.2 的分数将保持不变,而第二组的 0.18 将保持不变。换句话说,C-B 然后 B-A。查看所需的输出。

 A  
322 0.2
322 0.2
322 0.2
B   
455 0.15
455 0.15
455 0.15
C   
566 0.57
566 0.57
566 0.57

A   
322 0.18
322 0.18
322 0.18
B   
455 0.15
455 0.15
455 0.15
C   
566 0.66
566 0.66
566 0.66

我尝试将这段代码打印在第三列,但它似乎从上一行减去,而不是前一组。

awk '{$3 = $2 - prev2; prev2 = $2; print;}'

【问题讨论】:

  • 认为所需的操作是从 B 的第 2 列(例如,0.35 - 0.2 = 0.15 / 0.33 - 0.18 = 0.15)中减去 A 的第 2 列,从 C 的第 2 列(例如,@ 987654325@)
  • 我加了一些词。我只想从 B 组中减去 C 组,然后从 A 组中减去 B 组。
  • 是的,有100次重复的重复块。
  • 您的输入有 2 个名为“A”的组,一组全为 0.2,另一组全为 0.18。它们有某种关联吗?我在您发布的输出中没有看到任何表明group C subtracted from group B 等结果的内容。请检查您发布的输入/输出是否真正代表了您的真正问题以及您在文本中描述的内容。如果您有时有 3 行,有时有 4 行 - 请在您的示例中说明这一点,不要只在评论中告诉我们。
  • 您没有任何答案并不意味着没有人可以回答,这意味着我们不知道您在问什么。那么,为它发布解决方案对任何人都没有用。只需将问题改进为易于理解或删除即可。

标签: bash awk


【解决方案1】:

awk 来救援!

基于发布的输入/输出和隐含假设...

$ awk     '/^A/ {ia=1; c=0} 
             ia {a[c++]=$2} 
       /^[B-Z]/ {ia=c=0} 
    !ia && NF>1 {t=$2; $2-=a[++c]; a[c]=t}1' file

A
322 0.2
322 0.2
322 0.2
B
455 0.15
455 0.15
455 0.15
C
566 0.57
566 0.57
566 0.57

A
322 0.18
322 0.18
322 0.18
B
455 0.15
455 0.15
455 0.15
C
566 0.66
566 0.66
566 0.66

每个标题下的记录可以不同,但​​假设记录数相同。

如果此示例未代表您的真实输入,您可能需要调整条件。

说明

/^A/ {ia=1; c=0}如果标签以A开头,设置A指示符ai,重置计数器。

ia {a[c++]=$2}如果在A中,存储每条记录的值

/^[B-Z]/ {ia=c=0} 用于其他标签,在 A 和计数器中重置

!ia && NF>1 {t=$2; $2-=a[++c]; a[c]=t}如果不在A中且不是标签(字段数多于一个),保存数值,偏移对应记录之前保存的值,保存临时值作为记录位置的新偏移值.

1打印

【讨论】:

  • 它对我很有效。但是什么是A,B,C ..等。更改为不同的名称,例如 A-22、A-30、C-55。我该如何解决?提前感谢您解决这个问题。
  • 当我改变行数时,它们也改变了。例如,如果 A 组有 5 行,B 组有 2 行。唯一的共同点是每组的第一列。
  • 它要求组的元素数量相同,否则要减去什么?发布有代表性的样本很重要。该代码执行您口头描述的操作。应该与任何其他标签一起使用,以及以A 开头的标签将按照您的指定重置流程。
猜你喜欢
  • 1970-01-01
  • 2017-11-28
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 2021-01-04
相关资源
最近更新 更多