cut コマンドの実装
ruby で組んでみた。対応しているのは、-f オプションと -d オプションのみ。
それ以外は使わないので。
require 'optparse' class Fields def initialize(rule) @ranges = [] rule.split(",").each do |v| if /^(\d+)?(-)?(\d+)?$/ =~ v b = $1 ? $1.to_i : 1 unless $2 e = b else e = $3 ? $3.to_i : 10000 end @ranges.push(b..e) end end end def include?(index) @ranges.each do |r| return true if r.include?(index) end return false end end $fields = nil $delimiter = "\t" opt = OptionParser.new opt.on('-f VAL') {|v| $fields = Fields.new(v) } opt.on('-d VAL') {|v| $delimiter = v } opt.parse!(ARGV); while line = ARGF.gets line.chomp! s = line.split($delimiter, -1) if s.size == 1 print line else has_prev = false s.each_index do |i| if $fields.include?(i + 1) print $delimiter if has_prev print s[i] has_prev = true end end end print "\n" end