Используя Ruby в командной строке, как взять определенный столбец, который проходит через каждый - PullRequest
0 голосов
/ 31 мая 2011

У меня есть сценарий командной строки, который возвращает что-то вроде:

col1 col2 col3 col4 col5
a    b    c    d    e
a1   b2   c2   d2   e2
a3   b3   c3   d3   e3
..
..
.

Теперь я хочу взять значения из col3, а затем вызвать другой сценарий командной строки для каждой строки в столбце 3.

Я знаю, что в ruby ​​есть системная ("..") функция, которая будет запускать скрипт в консоли.

Мой скрипт командной строки очень похож на вызов чего-то вроде:

system("ls -l")

Теперь, как я могу захватить столбец № 3, перебрать каждое значение и запустить другой скрипт, передавая значение из столбца № 3 в качестве параметра?

Ответы [ 2 ]

2 голосов
/ 31 мая 2011
IO.popen('ls -l').lines.map(&:split)[1..-1].transpose[2].each do |e|
  puts '>>' + e + '<<'
end

Я должен предупредить вас, что если вы перейдете к очевидному следующему шагу и создадите вызов "system" или даже popen внутри блока, вы создадите риск внедрения кода. В этом конкретном случае, когда для владельца файла ожидаются только буквенно-цифровые результаты, простая фильтрация только по этим символам должна быть достаточно хорошей.

0 голосов
/ 31 мая 2011

Вы можете просто получить что-то вроде

#!/usr/bin/env ruby
cols, take_col = ARGV[0],ARGV[1]
puts $stdin.read.split.drop(cols).select.with_index{|x, i| i % cols == take_col - 1}

в файле, скажем, с именем take-col, и используйте его с pipe, как

$ ls-like-cmd | take-col 5 3 | next-cmd
...