问题:解决如何使用ruby对表格(二维数组)进行排序?例如,按照cpu或mem的使用率对top中的进程排序,选出cpu最高的进程
解决方法: 使用二维数组存储表格,然后按照cpu使用率排序整个二维数组,选出cpu最高的那一行
假设top信息存在于与脚本同目录的txt文件中。具体信息如下:
代码:
top_info_lines = []
column_names = []
#获取top信息需要处理的部分
top_info = IO.readlines('top_info.txt')[6..-1]
top_info.each do |line|
if line =~ /.*\%.*/
column_names = line.split() #第一行是各列的名字
end
end
top_info_lines = top_info[1..-1] #只获取带数字的信息部分
arr = Array.new(top_info_lines.size){Array.new(8) {0}} #创建二维数组,初始值为0
#将要排序的信息存进二维数组
top_info_lines.each_with_index do |x, row|
x.to_s.gsub(/\r\n?/, "").split().each_with_index do |y, col|
arr[row][col] = y
end
end
#按照第8列正序,第9列反序的方式排序
arr_sort = arr.sort_by{|a| [a[8].to_i, -a[9].to_i]}
if __FILE__ == $0
puts "the top info is :"
puts column_names.join(" ")
arr_sort.each do |element|
puts element.join(" ")
end
puts "****************************"
max_cpu_min_mem = []
#选出第8列值最大的行
max_cpu = arr_sort.map {|a| a[8].to_i }.max
max_cpu_lines = arr_sort.select{|a| a[8].to_i == max_cpu}
#从第8列值最大的行中,选出第9列值最小的行
min_mem = max_cpu_lines.map {|a| a[9].to_i }.min
max_cpu_min_mem = max_cpu_lines.select{|a| a[9].to_i == min_mem}
puts "the top info with max cpu and min mem is :"
max_cpu_min_mem.each do |element|
puts element.join(" ")
end
end
运行结果: