1) Вы можете использовать IO :: foreach в качестве удобного итератора для файла, используйте оператор сопоставления для проверки регулярных выражений, почти как в perl.
IO.foreach(li) do |line|
next unless line =~ /#{tag_11}|#{tag_35}/
...
end
2) Вы используете Array # push с тремя аргументами: строки, заполненные длинной звездочкой, лексическая переменная var и литерал "\ n".Кажется, вы намереваетесь сделать это тройкой, которую можно рассматривать как одну запись.push просто добавит их в массив, возможно, вы действительно хотите, чтобы они были подмассивом:
a.push [ '**** something ****', line, "\n" ]
Затем вы можете отсортировать по второму элементу с помощью
a.sort_by! {|e| e[1] }
Если вына самом деле нужен один плоский массив, вы можете нажать, как вы сделали, и использовать Enumerable # each_slice , чтобы сгруппировать по три:
a.each_slice(3).sort_by{|e| e[1]}.flatten(1)
ПОЗЖЕ: вот то, что я думаю, вы проситесортировка:
irb(main):001:0> a=[]
irb(main):002:0> a.push "** 1.mumble","20120210 08:04:05,404 DEBUG","\n"
irb(main):003:0> a.push "** 3.grumble","20120210 08:04:00,404 DEBUG","\n"
irb(main):004:0> a.push "** 2.mutter","20120210 08:03:05,404 DEBUG","\n"
=> ["** 1.mumble", "20120210 08:04:05,404 DEBUG", "\n", "** 3.grumble", "20120210 08:04:00,404 DEBUG", "\n", "** 2.mutter", "20120210 08:03:05,404 DEBUG", "\n"]
# sort by time stamp
irb(main):005:0> puts a.each_slice(3).sort_by { |label,ts,_| ts }.flatten(1)
** 2.mutter
20120210 08:03:05,404 DEBUG
** 3.grumble
20120210 08:04:00,404 DEBUG
** 1.mumble
20120210 08:04:05,404 DEBUG
# sort by integer value of first number in the label
irb(main):006:0> puts a.each_slice(3).sort_by{ |label,ts,_| label.match(/(\d+)/)[0].to_i }.flatten(1)
** 1.mumble
20120210 08:04:05,404 DEBUG
** 2.mutter
20120210 08:03:05,404 DEBUG
** 3.grumble
20120210 08:04:00,404 DEBUG