【问题标题】:Matrix addition in awkawk 中的矩阵加法
【发布时间】:2014-05-08 13:42:12
【问题描述】:

我有一堆看起来像这样的变量:

(DURATION 1.57) + (DURATION 2.07)
(T0 10) (T1 0) (TX 0) + (T0 12) (T1 0) (TX 1)
(TC 1) (IG 0) + (TC 2) (IG 3)

是否有可能让 awk 处理这个结果是:

(DURATION 3.64)
(T0 22) (T1 0) (TX 1) 
(TC 3) (IG 3) 

或者任何人都可以推荐另一个我可以用来执行此操作的 unix 程序吗?

【问题讨论】:

  • 这当然可以用awk 来完成(就像宇宙中几乎所有的文本处理任务一样)。问题是这是否合理:)。也许你知道生成这种结构化数据的程序?
  • 我会创建一个正式的 EBNF 语法(看起来很简单),然后使用例如为这些数据生成一个处理器。 bisonBoost.Spirit 试一试。
  • 我猜这是作业,所以不同的账号在相同的时间提出了类似的问题(stackoverflow.com/questions/23532337/…)然后老师稍后会将加号+改为其他运算符。
  • @BMW 很抱歉让您失望了,但这不适合做作业 ;-)。我试图写下我的问题的更一般的描述,但上面的例子更清楚。

标签: awk


【解决方案1】:

这是一种方法:

awk '{
    gsub(/[()+]/, "")
    for(nf=1; nf<=NF; nf+=2) {
        flds[$nf] += $(nf+1)
    }
    sep = ""
    for(fld in flds) {
        printf "%s(%s %g)", sep, fld, flds[fld]
    sep = FS
    }
    print "";
    delete flds
}' file
(DURATION 3.64)
(T0 22) (T1 0) (TX 1)
(TC 3) (IG 3)
  • 我们使用gsub() 函数删除了特殊字符()+
  • 我们遍历所有字段,将变量添加到数组并添加值
  • 我们遍历数组,以我们想要的格式打印它们。
  • 打印完成后添加新行
  • 删除数组,以便我们可以在下一行重新使用它
  • 注意: 行的顺序将与输入文件相同,但使用in 运算符作为我们的for loop,每行上的变量可能会以随机顺序出现。

【讨论】:

  • 非常感谢您的解决方案和解释!我唯一的问题是浮点值被四舍五入到最接近的整数。知道如何解决这个问题吗?我正在使用 GNU Awk 3.1.5。
  • @Michael 不客气。更新了解决方案,将%g 用于printf
  • 谢谢,用 %g 替换 %s 就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 2016-11-17
  • 2016-08-03
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
相关资源
最近更新 更多