简体   繁体   中英

Understanding how Ruby stdout works

i'm trying to understand how Ruby's stdout actually works, since i'm struggling with the output of some code. Actually, within my script i'm using a unix sort, which works fine from termina, but this is what i get from ruby, suppose you have this in your file (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

My ruby code is this:

@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}`

This is what i get (misplaced separators):

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

Whats happening here? When running from terminal i get no separators misplacement

enter code here

Instead of writing to a temporary file, passing the file via argument etc, you can use Ruby's open3 module to create the pipeline in a more Ruby-friendly manner (instead of relying on the underlying shell):

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 escaping problems, for example, become a thing from the past, and no temporary files are necessary, since pipes are used.

I would, however, advise doing this kind of processing in Ruby itself, instead of calling external utilities; you're getting no benefit from using Ruby here, you're just doing shell stuff.

As Linuxios says, your code never uses STDOUT, so your question doesn't make a lot of sense.

Here's a simple example showing how to do this all in Ruby.

Starting with an input file called "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

This code:

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

Creates this output in '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

Read about values_at and sort_by .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM