Использование Ruby в командной строке, как взять определенный столбец, который проходит через каждый из них

#ruby #enumeration

#ruby #перечисление

Вопрос:

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

 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 в качестве параметра?

Комментарии:

1. «Строки значений для каждого столбца», «каждая строка в столбце 3», «строки информации с 9 столбцами», «столбец # 3 и повторять каждое значение»: эти выражения трудны для понимания.

2. сава, я обновил его, ваше право, формулировка была запутанной, надеюсь, это лучше.

Ответ №1:

 IO.popen('ls -l').lines.map(amp;:split)[1..-1].transpose[2].each do |e|
  puts '>>'   e   '<<'
end
  

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

Комментарии:

1. Я запускаю это локально, и всем входным данным доверяют.

2. Конечно, я так и подозревал. Я бы предпочел ничего не говорить, но публикация простого объяснения здесь, на SO, иногда провоцирует охоту на ведьм с точки зрения безопасности, как будто под угрозой находятся сами золотые коды , поэтому я всегда должен говорить предостережение. Я должен держать его готовым к работе и просто вставить его. Чтобы быть справедливым к inquisitors, некоторые ответы посещались много лет, и мы должны учитывать, что увидят будущие посетители…

3. это очень заботливо с вашей стороны по отношению к веб-сайтам 🙂

Ответ №2:

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

 #!/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 , и использовать его с каналом, например

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