-
Notifications
You must be signed in to change notification settings - Fork 0
/
cut.rb
59 lines (53 loc) · 1.15 KB
/
cut.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
require 'optparse'
# どのフィールドを表示するかを判定するクラス
# カンマで区切る、
# '-M' は、'1-M'の意味
# 'N-' は、N番目から行の最後
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);
# 1行ごとに処理
while line = ARGF.gets
line.chomp!
# 文字列を分割(split)
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