Blame


1 aa83d772 2004-05-17 devnull #!/bin/sh
2 aa83d772 2004-05-17 devnull
3 aa83d772 2004-05-17 devnull # input:
4 aa83d772 2004-05-17 devnull # key (tab) string (tab) page numbers
5 aa83d772 2004-05-17 devnull # command command 123
6 aa83d772 2004-05-17 devnull # command, data command, [data] 11
7 aa83d772 2004-05-17 devnull # command, display command, [display] 11, 54, 63, 75
8 aa83d772 2004-05-17 devnull # command, model command, [model] 11
9 aa83d772 2004-05-17 devnull # command, quit command, [quit] 5, 16
10 aa83d772 2004-05-17 devnull # output:
11 aa83d772 2004-05-17 devnull # key (tab) string (tab) page numbers
12 aa83d772 2004-05-17 devnull # key command 123
13 aa83d772 2004-05-17 devnull # key [data] 11
14 aa83d772 2004-05-17 devnull # key [display] ...
15 aa83d772 2004-05-17 devnull # key [model] ...
16 aa83d772 2004-05-17 devnull # key [quit] ...
17 aa83d772 2004-05-17 devnull
18 aa83d772 2004-05-17 devnull awk '
19 aa83d772 2004-05-17 devnull BEGIN { FS = OFS = "\t" }
20 aa83d772 2004-05-17 devnull
21 aa83d772 2004-05-17 devnull { line[NR] = $0; x[NR] = $2 "\t" $3; y[NR] = $1 }
22 aa83d772 2004-05-17 devnull
23 aa83d772 2004-05-17 devnull # find a sequence that have the same prefix
24 aa83d772 2004-05-17 devnull # dump prefix, then each instance with spaces instead of prefix
25 aa83d772 2004-05-17 devnull END {
26 aa83d772 2004-05-17 devnull for (i = 1; i <= NR; i = j+1) {
27 aa83d772 2004-05-17 devnull j = findrun(i) # returns last elem of run
28 aa83d772 2004-05-17 devnull if (j > i)
29 aa83d772 2004-05-17 devnull printrun(i, j)
30 aa83d772 2004-05-17 devnull else
31 aa83d772 2004-05-17 devnull print y[i], x[i]
32 aa83d772 2004-05-17 devnull }
33 aa83d772 2004-05-17 devnull }
34 aa83d772 2004-05-17 devnull
35 aa83d772 2004-05-17 devnull function findrun(s, j, p, np) { # find y[s],y[s+1]... with same prefix
36 aa83d772 2004-05-17 devnull p = prefix(y[s])
37 aa83d772 2004-05-17 devnull np = length(p)
38 aa83d772 2004-05-17 devnull for (j = s+1; j <= NR; j++) {
39 aa83d772 2004-05-17 devnull if (y[j] == p) # same, so include
40 aa83d772 2004-05-17 devnull continue
41 aa83d772 2004-05-17 devnull if (index(y[j], p) != 1) # no match
42 aa83d772 2004-05-17 devnull break
43 aa83d772 2004-05-17 devnull c = substr(y[j], np+1, 1)
44 aa83d772 2004-05-17 devnull if (c != " " && c != ",") # has to be whole word prefix
45 aa83d772 2004-05-17 devnull break
46 aa83d772 2004-05-17 devnull }
47 aa83d772 2004-05-17 devnull return j-1
48 aa83d772 2004-05-17 devnull }
49 aa83d772 2004-05-17 devnull
50 aa83d772 2004-05-17 devnull function prefix(s, n) { # find 1st word of s: same sort key, minus ,
51 aa83d772 2004-05-17 devnull gsub(/,/, "", s)
52 aa83d772 2004-05-17 devnull n = index(s, " ")
53 aa83d772 2004-05-17 devnull if (n > 0)
54 aa83d772 2004-05-17 devnull return substr(s, 1, n-1)
55 aa83d772 2004-05-17 devnull else
56 aa83d772 2004-05-17 devnull return s
57 aa83d772 2004-05-17 devnull }
58 aa83d772 2004-05-17 devnull
59 aa83d772 2004-05-17 devnull function printrun(s, e, i) { # move [...] to end, "see" to front
60 aa83d772 2004-05-17 devnull s1 = 0; e1 = 0; p1 = 0; i1 = 0
61 aa83d772 2004-05-17 devnull for (i = s; i <= e; i++) {
62 aa83d772 2004-05-17 devnull if (x[i] ~ /{see/) { # see, see also
63 aa83d772 2004-05-17 devnull sx[s1] = x[i]
64 aa83d772 2004-05-17 devnull sy[s1] = y[i]
65 aa83d772 2004-05-17 devnull s1++
66 aa83d772 2004-05-17 devnull } else if (x[i] ~ /^\[/) { # prefix word is [...]
67 aa83d772 2004-05-17 devnull px[p1] = x[i]
68 aa83d772 2004-05-17 devnull py[p1] = y[i]
69 aa83d772 2004-05-17 devnull p1++
70 aa83d772 2004-05-17 devnull } else if (x[i] ~ /\[.*\]/) { # [...] somewhere else
71 aa83d772 2004-05-17 devnull ex[e1] = x[i]
72 aa83d772 2004-05-17 devnull ey[e1] = y[i]
73 aa83d772 2004-05-17 devnull e1++
74 aa83d772 2004-05-17 devnull } else { # none of the above
75 aa83d772 2004-05-17 devnull ix[i1] = x[i]
76 aa83d772 2004-05-17 devnull iy[i1] = y[i]
77 aa83d772 2004-05-17 devnull i1++
78 aa83d772 2004-05-17 devnull }
79 aa83d772 2004-05-17 devnull }
80 aa83d772 2004-05-17 devnull if (e-s+1 != s1 + p1 + i1 + e1) print "oh shit" >"/dev/stderr"
81 aa83d772 2004-05-17 devnull
82 aa83d772 2004-05-17 devnull for (i = 0; i < s1; i++) # "see", one/line
83 aa83d772 2004-05-17 devnull print sy[i], sx[i]
84 aa83d772 2004-05-17 devnull if (i1 > 1)
85 aa83d772 2004-05-17 devnull printgroup(ix,iy,0,i1) # non [...] items
86 aa83d772 2004-05-17 devnull else if (i1 == 1)
87 aa83d772 2004-05-17 devnull print iy[0], ix[0]
88 aa83d772 2004-05-17 devnull if (e1 > 1)
89 aa83d772 2004-05-17 devnull printgroup(ex,ey,0,e1) # prefix [...] items
90 aa83d772 2004-05-17 devnull else if (e1 == 1)
91 aa83d772 2004-05-17 devnull print ey[0], ex[0]
92 aa83d772 2004-05-17 devnull # for (i = 0; i < p1; i++) # [prefix] ... items
93 aa83d772 2004-05-17 devnull # print py[i], px[i]
94 aa83d772 2004-05-17 devnull if (p1 > 1)
95 aa83d772 2004-05-17 devnull printgroup(px,py,0,p1) # [prefix] ... items
96 aa83d772 2004-05-17 devnull else if (p1 == 1)
97 aa83d772 2004-05-17 devnull print py[0], px[0]
98 aa83d772 2004-05-17 devnull }
99 aa83d772 2004-05-17 devnull
100 aa83d772 2004-05-17 devnull function printgroup(x, y, s, e, i, j) {
101 aa83d772 2004-05-17 devnull split(x[s], f23)
102 aa83d772 2004-05-17 devnull if (split(f23[1], temp, " ") > 1) {
103 aa83d772 2004-05-17 devnull pfx = temp[1] " " temp[2] # 2-word prefix
104 aa83d772 2004-05-17 devnull for (i = s+1; i < e; i++) {
105 aa83d772 2004-05-17 devnull if (index(x[i], pfx) != 1)
106 aa83d772 2004-05-17 devnull break
107 aa83d772 2004-05-17 devnull c = substr(x[i], length(pfx)+1, 1)
108 aa83d772 2004-05-17 devnull if (c != " " && c != ",") # has to be whole word prefix
109 aa83d772 2004-05-17 devnull break
110 aa83d772 2004-05-17 devnull }
111 aa83d772 2004-05-17 devnull if (i == e) {
112 aa83d772 2004-05-17 devnull # print "got a run with", pfx
113 aa83d772 2004-05-17 devnull sub(/ /, "@", f23[1])
114 aa83d772 2004-05-17 devnull for (i = s; i < e; i++)
115 aa83d772 2004-05-17 devnull sub(/ /, "@", x[i]) # take @ out later
116 aa83d772 2004-05-17 devnull }
117 aa83d772 2004-05-17 devnull }
118 aa83d772 2004-05-17 devnull n = sub(/,?[ ~]+.*/, "", f23[1]) # zap rest of line
119 aa83d772 2004-05-17 devnull
120 aa83d772 2004-05-17 devnull sub(/,$/, "", f23[1])
121 aa83d772 2004-05-17 devnull if (n > 0) { # some change, so not a single word
122 aa83d772 2004-05-17 devnull sub(/@/, " ", f23[1])
123 aa83d772 2004-05-17 devnull print y[s], f23[1] # print main entry
124 aa83d772 2004-05-17 devnull }
125 aa83d772 2004-05-17 devnull for (j = s; j < e; j++) {
126 aa83d772 2004-05-17 devnull split(x[j], f23)
127 aa83d772 2004-05-17 devnull sub(/^[^, ]+[, ]+/, " ", f23[1])
128 aa83d772 2004-05-17 devnull sub(/@/, " ", f23[1])
129 aa83d772 2004-05-17 devnull print y[s], f23[1], f23[2]
130 aa83d772 2004-05-17 devnull }
131 aa83d772 2004-05-17 devnull }
132 aa83d772 2004-05-17 devnull
133 aa83d772 2004-05-17 devnull ' $*