我正在努力理解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
答案 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