Запуск набора скриптов Ruby в Терминале - PullRequest
0 голосов
/ 05 мая 2019

Я хочу повторно запустить скрипт Ruby в окне терминала Mac, который выполняет текстовый поиск по текстовому файлу. Сценарий хорошо работает с каждым текстовым файлом в терминале, но я хочу сделать это несколько раз для последовательности файлов.

Я пытался создать скрипт в automator, но безуспешно. К вашему сведению, скрипт Ruby прилагается, но это не проблема

Спасибо

#!/usr/bin/env ruby
require 'yaml'
require 'csv'
abort "You must specify one or more files to search." if ARGV.size == 0

search_terms = "---
:stage1:
  JTSJ3:
  - text term 1
:stage2n:
  JTSJ3:
  - nothing
:stage2p:
  JTSJ3:
  - text term 2
:stage3:
  JTSJ3:
  - nothing"

...
File.open(File.join(result_dir, 'results_stage3.yml'), 'w') do |f|
  f.write stage3_results.to_yaml
end
File.open(File.join(result_dir, 'results_stage3.csv'), 'w') do |f|
  f.write csv_header.to_csv
  stage3_results.each do |r|
    f.write [ r[:category], r[:term], r[:line], r[:text], r[:file] ].to_csv
  end
end

1 Ответ

0 голосов
/ 05 мая 2019

Есть несколько шаблонов, которые вы можете использовать здесь, но для применения этих методов ключ состоит в том, чтобы определить простой метод точки входа, который вы можете вызывать по мере необходимости, вместо того, чтобы все эти вещи просто разбросаны в пространстве имен main.

Извлечение имен файлов из списка аргументов ARGV:

ARGV.each do |file|
  process(file)
end

Вы можете использовать File.basename(file, '.yml'), чтобы убрать расширения и переключить их на .csv, если хотите.Держите ваш метод как можно более универсальным.

Во-вторых, вы можете использовать xargs извне:

find . -name '*.yml' | xargs ruby program.rb

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

find . -name '*.yml' | xargs -n 2 -p 8 ruby program.rb

Где выполняется 8 параллельных процессов (-p 8), каждый из которых обрабатывает до двух файлов (-n 2).

Вы также можете сделать это самостоятельно с помощью:

Dir.glob('source_dir/**/*.yml') do |file|
  process(file)
end

Где Dir.glob отлично подходит для поиска многих вещей.Чтобы распараллелить это, вы можете использовать потоки или разветвление.xargs - это быстрый способ получить все это бесплатно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...