1#!/bin/bash 2 3if [[ -z "$AWK" || -z "$WORKDIR" ]]; then 4 printf '$AWK and $WORKDIR must be set\n' >&2 5 exit 1 6fi 7 8TEMP0=$WORKDIR/test.temp.0 9TEMP1=$WORKDIR/test.temp.1 10TEMP2=$WORKDIR/test.temp.2 11 12RESULT=0 13 14fail() { 15 echo "$1" >&2 16 RESULT=1 17} 18 19echo T.gawk: tests adapted from gawk test suite 20# for which thanks. 21 22# arrayref: 23echo '1 241' > $TEMP1 25$AWK ' 26 BEGIN { # foo[10] = 0 # put this line in and it will work 27 test(foo); print foo[1] 28 test2(foo2); print foo2[1] 29 } 30 function test(foo) { test2(foo) } 31 function test2(bar) { bar[1] = 1 } 32' > $TEMP2 33diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk arrayref' 34 35# asgext 36echo '1 2 3 371 381 2 3 4' > $TEMP0 39echo '3 401 2 3 a 41 421 a 433 441 2 3 a' > $TEMP1 45$AWK '{ print $3; $4 = "a"; print }' $TEMP0 > $TEMP2 46diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk asgext' 47 48# backgsub: 49cat <<< 'x\y 50x\\y' > $TEMP0 51cat <<< 'x\y 52xAy 53xAy 54xAAy' > $TEMP1 55$AWK '{ x = y = $0 56 gsub( /\\\\/, "A", x); print x 57 gsub( "\\\\", "A", y); print y 58}' $TEMP0 > $TEMP2 59diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk backgsub' 60 61 62# backgsub3: 63cat <<< 'xax 64xaax' > $TEMP0 65cat <<< ' xax 66 x&x 67 x&x 68 x\ax 69 x\ax 70 x\&x 71 xaax 72 x&&x 73 x&&x 74 x\a\ax 75 x\a\ax 76 x\&\&x' > $TEMP1 77$AWK '{ w = x = y = z = z1 = z2 = $0 78 gsub( /a/, "\&", w); print " " w 79 gsub( /a/, "\\&", x); print " " x 80 gsub( /a/, "\\\&", y); print " " y 81 gsub( /a/, "\\\\&", z); print " " z 82 gsub( /a/, "\\\\\&", z1); print " " z1 83 gsub( /a/, "\\\\\\&", z2); print " " z2 84} 85' $TEMP0 > $TEMP2 86diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk backgsub3' 87 88 89# backsub3: 90cat <<< 'xax 91xaax' > $TEMP0 92cat <<< ' xax 93 x&x 94 x&x 95 x\ax 96 x\ax 97 x\&x 98 xaax 99 x&ax 100 x&ax 101 x\aax 102 x\aax 103 x\&ax' > $TEMP1 104$AWK '{ w = x = y = z = z1 = z2 = $0 105 sub( /a/, "\&", w); print " " w 106 sub( /a/, "\\&", x); print " " x 107 sub( /a/, "\\\&", y); print " " y 108 sub( /a/, "\\\\&", z); print " " z 109 sub( /a/, "\\\\\&", z1); print " " z1 110 sub( /a/, "\\\\\\&", z2); print " " z2 111} 112' $TEMP0 > $TEMP2 113diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk backsub3' 114 115 116 117# dynlj: 118echo 'hello world' > $TEMP1 119$AWK 'BEGIN { printf "%*sworld\n", -20, "hello" }' > $TEMP2 120diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk dynlj' 121 122# fsrs: 123echo 'a b 124c d 125e f 126 1271 2 1283 4 1295 6' > $TEMP0 130# note -n: 131echo -n 'a b 132c d 133e f1 2 1343 4 1355 6' > $TEMP1 136$AWK ' 137BEGIN { 138 RS=""; FS="\n"; 139 ORS=""; OFS="\n"; 140 } 141{ 142 split ($2,f," ") 143 print $0; 144}' $TEMP0 > $TEMP2 145diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk fsrs' 146 147# intest 148echo '0 1' > $TEMP1 149$AWK 'BEGIN { 150 bool = ((b = 1) in c); 151 print bool, b # gawk-3.0.1 prints "0 "; should print "0 1" 152}' > $TEMP2 153diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk intest' 154 155# intprec: 156echo '0000000005:000000000e' > $TEMP1 157$AWK 'BEGIN { printf "%.10d:%.10x\n", 5, 14 }' > $TEMP2 158diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk intprec' 159 160# litoct: 161echo 'axb 162ab 163a*b' > $TEMP0 164echo 'no match 165no match 166match' > $TEMP1 167$AWK '{ if (/a\52b/) print "match" ; else print "no match" }' $TEMP0 > $TEMP2 168diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk litoct' 169 170# math: 171echo 'cos(0.785398) = 0.707107 172sin(0.785398) = 0.707107 173e = 2.718282 174log(e) = 1.000000 175sqrt(pi ^ 2) = 3.141593 176atan2(1, 1) = 0.785398' > $TEMP1 177$AWK 'BEGIN { 178 pi = 3.1415927 179 printf "cos(%f) = %f\n", pi/4, cos(pi/4) 180 printf "sin(%f) = %f\n", pi/4, sin(pi/4) 181 e = exp(1) 182 printf "e = %f\n", e 183 printf "log(e) = %f\n", log(e) 184 printf "sqrt(pi ^ 2) = %f\n", sqrt(pi ^ 2) 185 printf "atan2(1, 1) = %f\n", atan2(1, 1) 186}' > $TEMP2 187diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk math' 188 189# nlfldsep: 190echo 'some stuff 191more stuffA 192junk 193stuffA 194final' > $TEMP0 195echo '4 196some 197stuff 198more 199stuff 200 2012 202junk 203stuff 204 2051 206final 207' > $TEMP1 208$AWK 'BEGIN { RS = "A" } 209{print NF; for (i = 1; i <= NF; i++) print $i ; print ""} 210' $TEMP0 > $TEMP2 211diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk nlfldsep' 212 213# numsubstr: 214echo '5000 21510000 2165000' > $TEMP0 217echo '000 2181000 219000' > $TEMP1 220$AWK '{ print substr(1000+$1, 2) }' $TEMP0 > $TEMP2 221diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk numsubstr' 222 223# pcntplus: 224echo '+3 4' > $TEMP1 225$AWK 'BEGIN { printf "%+d %d\n", 3, 4 }' > $TEMP2 226diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk pcntplus' 227 228# prt1eval: 229echo 1 > $TEMP1 230$AWK 'function tst () { 231 sum += 1 232 return sum 233} 234BEGIN { OFMT = "%.0f" ; print tst() } 235' > $TEMP2 236diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk prt1eval' 237 238# reparse: 239echo '1 axbxc 2' > $TEMP0 240echo '1 2411 a b c 2 2421 a b' > $TEMP1 243$AWK '{ gsub(/x/, " ") 244 $0 = $0 245 print $1 246 print $0 247 print $1, $2, $3 248}' $TEMP0 > $TEMP2 249diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk reparse' 250 251# rswhite: 252echo ' a b 253c d' > $TEMP0 254echo '< a b 255c d>' > $TEMP1 256$AWK 'BEGIN { RS = "" } 257{ printf("<%s>\n", $0) }' $TEMP0 > $TEMP2 258diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk rswhite' 259 260# splitvar: 261echo 'Here===Is=Some=====Data' > $TEMP0 262echo 4 > $TEMP1 263$AWK '{ sep = "=+" 264 n = split($0, a, sep) 265 print n 266}' $TEMP0 > $TEMP2 267diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk splitvar' 268 269# splitwht: 270echo '4 2715' > $TEMP1 272$AWK 'BEGIN { 273 str = "a b\t\tc d" 274 n = split(str, a, " ") 275 print n 276 m = split(str, b, / /) 277 print m 278}' > $TEMP2 279diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk splitwht' 280 281# sprintfc: 282echo '65 28366 284foo' > $TEMP0 285echo 'A 65 286B 66 287f foo' > $TEMP1 288$AWK '{ print sprintf("%c", $1), $1 }' $TEMP0 > $TEMP2 289diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk sprintfc' 290 291# substr: 292echo 'xxA 293xxab 294xxbc 295xxab 296xx 297xx 298xxab 299xx 300xxef 301xx' > $TEMP1 302$AWK 'BEGIN { 303 x = "A" 304 printf("xx%-39s\n", substr(x,1,39)) 305 print "xx" substr("abcdef", 0, 2) 306 print "xx" substr("abcdef", 2.3, 2) 307 print "xx" substr("abcdef", -1, 2) 308 print "xx" substr("abcdef", 1, 0) 309 print "xx" substr("abcdef", 1, -3) 310 print "xx" substr("abcdef", 1, 2.3) 311 print "xx" substr("", 1, 2) 312 print "xx" substr("abcdef", 5, 5) 313 print "xx" substr("abcdef", 7, 2) 314 exit (0) 315}' > $TEMP2 316diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk substr' 317 318# fldchg: 319echo 'aa aab c d e f' > $TEMP0 320echo '1: + +b c d e f 3212: + +b <c> d e f 3222a:%+%+b%<c>%d%e' > $TEMP1 323$AWK '{ gsub("aa", "+") 324 print "1:", $0 325 $3 = "<" $3 ">" 326 print "2:", $0 327 print "2a:" "%" $1 "%" $2 "%" $3 "%" $4 "%" $5 328}' $TEMP0 > $TEMP2 329diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk fldchg' 330 331# fldchgnf: 332echo 'a b c d' > $TEMP0 333echo 'a::c:d 3344' > $TEMP1 335$AWK '{ OFS = ":"; $2 = ""; print $0; print NF }' $TEMP0 > $TEMP2 336diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk fldchgnf' 337 338### # convfmt: 339### echo 'a = 123.46 340### a = 123.456 341### a = 123.456' > $TEMP1 342### $AWK 'BEGIN { 343### CONVFMT = "%2.2f" 344### a = 123.456 345### b = a "" # give a string value also 346### a += 0 # make a numeric only again 347### print "a = ", a 348### CONVFMT = "%.6g" 349### print "a = ", a 350### a += 0 # make a numeric only again 351### print "a = ", a # use a as string 352### }' > $TEMP2 353### diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk convfmt' 354 355exit $RESULT 356