【问题标题】:Awk-like BEGIN and END with Ruby command-line使用 Ruby 命令行的类似 Awk 的 BEGIN 和 END
【发布时间】:2012-01-11 12:19:54
【问题描述】:

关于 Ruby 的一个很酷的地方是它能够像典型的 Unix 命令行工具一样工作,执行以下操作(类似于官方文档中的示例):

$ echo "matz" | ruby -pe '$_.upcase!'
MATZ

另一方面,Awk 可以对来自标准输入的行进行聚合,例如,对一系列数字求和:

$ for (( i=0; $i < 50; i++ )); do echo $i; done | awk 'BEGIN { tot=0; } { tot += $0 } END { print tot }'
1225

我想知道是否有可能让 Ruby 完成上面的 Awk BEGIN 和 END 块所实现的功能,以便能够进行类似的聚合操作。

【问题讨论】:

  • 此代码示例中是否需要 BEGIN 和 END?

标签: ruby unix command-line awk


【解决方案1】:
seq 49 | ruby -pe 'BEGIN { $tot=0 }; $tot += $_.to_i; END { print $tot }'

【讨论】:

  • 我已经将这个逐字复制到命令行,但它不起作用。我需要最低版本的 Ruby 吗?
  • 我在这里使用 ruby​​ 1.9,archlinux 中没有 1.8 二进制文件。尝试 1.9 - 现在已经有几年了。 ;-)
  • 我使用的是 1.8.7 (Cygwin),并注意到如果我将 tot 更改为 $tot 一切正常。
  • 看起来 1.8 和 1.9 之间存在一些范围差异 :-)
  • 尝试添加尾随“\n”以更清楚地看到它。 END { 打印 $tot , "\n" }
【解决方案2】:

实际上 ruby​​ 也有 BEGIN/END 块支持。例如看这篇博文:http://burkelibbey.posterous.com/rubys-other-begin

更多文档:http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html#UA

HTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 2013-09-06
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多