Blame


1 aa83d772 2004-05-17 devnull awk ' # range.collapse
2 aa83d772 2004-05-17 devnull # Input: lines of form: string (tab) ["b"|"e"|"a"] (tab) number
3 aa83d772 2004-05-17 devnull # Output: lines of form: string (tab) num [(space) num]
4 aa83d772 2004-05-17 devnull # In sequence of lines with same value of string:
5 aa83d772 2004-05-17 devnull # b line and following e line are combined into single line:
6 aa83d772 2004-05-17 devnull # string (tab) num num
7 aa83d772 2004-05-17 devnull # a line disappears if between paired b and e
8 aa83d772 2004-05-17 devnull # a line otherwise becomes single line:
9 aa83d772 2004-05-17 devnull # string (tab) num
10 aa83d772 2004-05-17 devnull
11 aa83d772 2004-05-17 devnull function error(s) {
12 aa83d772 2004-05-17 devnull print "range.collapse: " s " near pp " rlo "-" rhi | "cat 1>&2"
13 aa83d772 2004-05-17 devnull }
14 aa83d772 2004-05-17 devnull function printoldrange() {
15 aa83d772 2004-05-17 devnull if (range == 1) { error("no %end for " term); rhi = "XXX" }
16 aa83d772 2004-05-17 devnull if (NR > 1) {
17 aa83d772 2004-05-17 devnull if (rlo == rhi)
18 aa83d772 2004-05-17 devnull print term, rlo
19 aa83d772 2004-05-17 devnull else
20 aa83d772 2004-05-17 devnull print term, (rlo " " rhi)
21 aa83d772 2004-05-17 devnull }
22 aa83d772 2004-05-17 devnull rlo = rhi = $3 # bounds of current range
23 aa83d772 2004-05-17 devnull }
24 aa83d772 2004-05-17 devnull
25 aa83d772 2004-05-17 devnull BEGIN { FS = OFS = "\t" }
26 aa83d772 2004-05-17 devnull $1 != term { printoldrange(); term = $1; range = 0 }
27 aa83d772 2004-05-17 devnull $2 == "e" { if (range == 1) { range = 0; rhi = $3 }
28 aa83d772 2004-05-17 devnull else { printoldrange(); error("no %begin for " term); rlo = "XXX" }
29 aa83d772 2004-05-17 devnull next
30 aa83d772 2004-05-17 devnull }
31 aa83d772 2004-05-17 devnull $3 <= rhi + 1 { rhi = $3}
32 aa83d772 2004-05-17 devnull $3 > rhi + 1 { if (range == 0) printoldrange() }
33 aa83d772 2004-05-17 devnull $2 == "b" { if (range == 1) error("multiple %begin for " term); range = 1 }
34 aa83d772 2004-05-17 devnull END { if (NR == 1) NR = 2; printoldrange() }
35 aa83d772 2004-05-17 devnull ' $*