了解Ruby stdout的工作原理

时间:2014-03-29 15:21:42

标签: ruby stdout

我正在努力理解Ruby的stdout实际上是如何工作的,因为我正在努力处理某些代码的输出。 实际上,在我的脚本中,我使用的是unix排序,从终端可以正常工作,但这是我从ruby获得的,假设你的文件中有这个(tsv)

a       b       c       d       e       f       g       h       i       l       m
a       b       c       d       e       f       g       h       i       l       m
a       b       c       d       e       f       g       h       i       l       m
a       b       c       d       e       f       g       h       i       l       m
a       b       c       d       e       f       g       h       i       l       m
a       b       c       d       e       f       g       h       i       l       m
a       b       c       d       e       f       g       h       i       l       m
a       b       c       d       e       f       g       h       i       l       m

我的红宝石代码是:

@raw_file=File.open(ARGV[0],"r") unless File.open(ARGV[0],"r").nil?
tmp_raw=File.new("#{@pwd}/tmp_raw","w")
 `cut -f1,6,3,4,2,5,9,12 #{@raw_file.path} | sort -k1,1 -k8,8 > #{tmp_raw.path}`

这就是我得到的(错位的分隔符):

a       b       c       d       e       f       i
        1a       b       c       d       e       f       g       h       i       l       m
        1

这里发生了什么? 从终端运行时,我没有错位分隔符

enter code here

2 个答案:

答案 0 :(得分:2)

不是写入临时文件,通过参数等传递文件,而是可以使用Ruby的open3模块以更加Ruby友好的方式创建管道(而不是依赖于底层壳):

require 'open3'

raw_file = File.open(ARGV[0], "r")

commands = [
  ["cut", "-f1,6,3,4,2,5,9,12"],
  ["sort", "-k1,1", "-k8,8"],
]

result = Open3.pipeline_r(*commands, in: raw_file) do |out|
  break out.read
end

puts result
例如,shell逃避问题成为过去的事情,因为管道被使用,所以不需要临时文件。

但是,我会建议在Ruby本身进行这种处理,而不是调用外部实用程序;你在这里使用Ruby没有任何好处,你只是在做shell的事情。

答案 1 :(得分:0)

正如Linuxios所说,你的代码从不使用STDOUT,所以你的问题没有多大意义。

这是一个简单的例子,展示如何在Ruby中完成所有这些。

从名为“test.txt”的输入文件开始:

    a       b       c       d       e       f       g       h       i       l       m
    a       b       c       d       e       f       g       h       i       l       m
    a       b       c       d       e       f       g       h       i       l       m
    a       b       c       d       e       f       g       h       i       l       m
    a       b       c       d       e       f       g       h       i       l       m
    a       b       c       d       e       f       g       h       i       l       m
    a       b       c       d       e       f       g       h       i       l       m
    a       b       c       d       e       f       g       h       i       l       m

此代码:

File.open('test_out.txt', 'w') do |test_out|
  File.foreach('test.txt') do |line_in|
    chars = line_in.split
    test_out.puts chars.values_at(0, 5, 2, 3, 1, 4, 8, 10).sort_by{ |*c| [c[0], c[7]] }.join("\t")
  end
end

在'test_out.txt'中创建此输出:

    a       b       c       d       e       f       i       m
    a       b       c       d       e       f       i       m
    a       b       c       d       e       f       i       m
    a       b       c       d       e       f       i       m
    a       b       c       d       e       f       i       m
    a       b       c       d       e       f       i       m
    a       b       c       d       e       f       i       m
    a       b       c       d       e       f       i       m

了解values_atsort_by