blob: 9119cea681c91ca41d7217411e3638c05b3acfe7 (
plain)
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
|
awk ' # range.collapse
# Input: lines of form: string (tab) ["b"|"e"|"a"] (tab) number
# Output: lines of form: string (tab) num [(space) num]
# In sequence of lines with same value of string:
# b line and following e line are combined into single line:
# string (tab) num num
# a line disappears if between paired b and e
# a line otherwise becomes single line:
# string (tab) num
function error(s) {
print "range.collapse: " s " near pp " rlo "-" rhi | "cat 1>&2"
}
function printoldrange() {
if (range == 1) { error("no %end for " term); rhi = "XXX" }
if (NR > 1) {
if (rlo == rhi)
print term, rlo
else
print term, (rlo " " rhi)
}
rlo = rhi = $3 # bounds of current range
}
BEGIN { FS = OFS = "\t" }
$1 != term { printoldrange(); term = $1; range = 0 }
$2 == "e" { if (range == 1) { range = 0; rhi = $3 }
else { printoldrange(); error("no %begin for " term); rlo = "XXX" }
next
}
$3 <= rhi + 1 { rhi = $3}
$3 > rhi + 1 { if (range == 0) printoldrange() }
$2 == "b" { if (range == 1) error("multiple %begin for " term); range = 1 }
END { if (NR == 1) NR = 2; printoldrange() }
' $*
|