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# backgsub2: 63cat <<< 'x\y 64x\\y 65x\\\y' > $TEMP0 66cat <<< ' x\y 67 x\y 68 x\y 69 x\y 70 x\\y 71 x\\\y 72 x\\y 73 x\\\y 74 x\\\\y' > $TEMP1 75$AWK '{ w = x = y = z = $0 76 gsub( /\\\\/, "\\", w); print " " w 77 gsub( /\\\\/, "\\\\", x); print " " x 78 gsub( /\\\\/, "\\\\\\", y); print " " y 79} 80' $TEMP0 > $TEMP2 81diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk backgsub2' 82 83 84# backgsub3: 85cat <<< 'xax 86xaax' > $TEMP0 87cat <<< ' xax 88 x&x 89 x&x 90 x\ax 91 x\ax 92 x\&x 93 xaax 94 x&&x 95 x&&x 96 x\a\ax 97 x\a\ax 98 x\&\&x' > $TEMP1 99$AWK '{ w = x = y = z = z1 = z2 = $0 100 gsub( /a/, "\&", w); print " " w 101 gsub( /a/, "\\&", x); print " " x 102 gsub( /a/, "\\\&", y); print " " y 103 gsub( /a/, "\\\\&", z); print " " z 104 gsub( /a/, "\\\\\&", z1); print " " z1 105 gsub( /a/, "\\\\\\&", z2); print " " z2 106} 107' $TEMP0 > $TEMP2 108diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk backgsub3' 109 110 111# backsub3: 112cat <<< 'xax 113xaax' > $TEMP0 114cat <<< ' xax 115 x&x 116 x&x 117 x\ax 118 x\ax 119 x\&x 120 xaax 121 x&ax 122 x&ax 123 x\aax 124 x\aax 125 x\&ax' > $TEMP1 126$AWK '{ w = x = y = z = z1 = z2 = $0 127 sub( /a/, "\&", w); print " " w 128 sub( /a/, "\\&", x); print " " x 129 sub( /a/, "\\\&", y); print " " y 130 sub( /a/, "\\\\&", z); print " " z 131 sub( /a/, "\\\\\&", z1); print " " z1 132 sub( /a/, "\\\\\\&", z2); print " " z2 133} 134' $TEMP0 > $TEMP2 135diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk backsub3' 136 137 138# backsub: 139cat <<< 'x\y 140x\\y' > $TEMP0 141cat <<< 'x\y 142x\\y 143x\\y 144x\\\y' > $TEMP1 145$AWK '{ x = y = $0 146 sub( /\\\\/, "\\\\", x); print x 147 sub( "\\\\", "\\\\", y); print y 148}' $TEMP0 > $TEMP2 149diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk backsub' 150 151 152 153 154# dynlj: 155echo 'hello world' > $TEMP1 156$AWK 'BEGIN { printf "%*sworld\n", -20, "hello" }' > $TEMP2 157diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk dynlj' 158 159# fsrs: 160echo 'a b 161c d 162e f 163 1641 2 1653 4 1665 6' > $TEMP0 167# note -n: 168echo -n 'a b 169c d 170e f1 2 1713 4 1725 6' > $TEMP1 173$AWK ' 174BEGIN { 175 RS=""; FS="\n"; 176 ORS=""; OFS="\n"; 177 } 178{ 179 split ($2,f," ") 180 print $0; 181}' $TEMP0 > $TEMP2 182diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk fsrs' 183 184# intest 185echo '0 1' > $TEMP1 186$AWK 'BEGIN { 187 bool = ((b = 1) in c); 188 print bool, b # gawk-3.0.1 prints "0 "; should print "0 1" 189}' > $TEMP2 190diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk intest' 191 192# intprec: 193echo '0000000005:000000000e' > $TEMP1 194$AWK 'BEGIN { printf "%.10d:%.10x\n", 5, 14 }' > $TEMP2 195diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk intprec' 196 197# litoct: 198echo 'axb 199ab 200a*b' > $TEMP0 201echo 'no match 202no match 203match' > $TEMP1 204$AWK '{ if (/a\52b/) print "match" ; else print "no match" }' $TEMP0 > $TEMP2 205diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk litoct' 206 207# math: 208echo 'cos(0.785398) = 0.707107 209sin(0.785398) = 0.707107 210e = 2.718282 211log(e) = 1.000000 212sqrt(pi ^ 2) = 3.141593 213atan2(1, 1) = 0.785398' > $TEMP1 214$AWK 'BEGIN { 215 pi = 3.1415927 216 printf "cos(%f) = %f\n", pi/4, cos(pi/4) 217 printf "sin(%f) = %f\n", pi/4, sin(pi/4) 218 e = exp(1) 219 printf "e = %f\n", e 220 printf "log(e) = %f\n", log(e) 221 printf "sqrt(pi ^ 2) = %f\n", sqrt(pi ^ 2) 222 printf "atan2(1, 1) = %f\n", atan2(1, 1) 223}' > $TEMP2 224diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk math' 225 226# nlfldsep: 227echo 'some stuff 228more stuffA 229junk 230stuffA 231final' > $TEMP0 232echo '4 233some 234stuff 235more 236stuff 237 2382 239junk 240stuff 241 2421 243final 244' > $TEMP1 245$AWK 'BEGIN { RS = "A" } 246{print NF; for (i = 1; i <= NF; i++) print $i ; print ""} 247' $TEMP0 > $TEMP2 248diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk nlfldsep' 249 250# numsubstr: 251echo '5000 25210000 2535000' > $TEMP0 254echo '000 2551000 256000' > $TEMP1 257$AWK '{ print substr(1000+$1, 2) }' $TEMP0 > $TEMP2 258diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk numsubstr' 259 260# pcntplus: 261echo '+3 4' > $TEMP1 262$AWK 'BEGIN { printf "%+d %d\n", 3, 4 }' > $TEMP2 263diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk pcntplus' 264 265# prt1eval: 266echo 1 > $TEMP1 267$AWK 'function tst () { 268 sum += 1 269 return sum 270} 271BEGIN { OFMT = "%.0f" ; print tst() } 272' > $TEMP2 273diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk prt1eval' 274 275# reparse: 276echo '1 axbxc 2' > $TEMP0 277echo '1 2781 a b c 2 2791 a b' > $TEMP1 280$AWK '{ gsub(/x/, " ") 281 $0 = $0 282 print $1 283 print $0 284 print $1, $2, $3 285}' $TEMP0 > $TEMP2 286diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk reparse' 287 288# rswhite: 289echo ' a b 290c d' > $TEMP0 291echo '< a b 292c d>' > $TEMP1 293$AWK 'BEGIN { RS = "" } 294{ printf("<%s>\n", $0) }' $TEMP0 > $TEMP2 295diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk rswhite' 296 297# splitvar: 298echo 'Here===Is=Some=====Data' > $TEMP0 299echo 4 > $TEMP1 300$AWK '{ sep = "=+" 301 n = split($0, a, sep) 302 print n 303}' $TEMP0 > $TEMP2 304diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk splitvar' 305 306# splitwht: 307echo '4 3085' > $TEMP1 309$AWK 'BEGIN { 310 str = "a b\t\tc d" 311 n = split(str, a, " ") 312 print n 313 m = split(str, b, / /) 314 print m 315}' > $TEMP2 316diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk splitwht' 317 318# sprintfc: 319echo '65 32066 321foo' > $TEMP0 322echo 'A 65 323B 66 324f foo' > $TEMP1 325$AWK '{ print sprintf("%c", $1), $1 }' $TEMP0 > $TEMP2 326diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk sprintfc' 327 328# substr: 329echo 'xxA 330xxab 331xxbc 332xxab 333xx 334xx 335xxab 336xx 337xxef 338xx' > $TEMP1 339$AWK 'BEGIN { 340 x = "A" 341 printf("xx%-39s\n", substr(x,1,39)) 342 print "xx" substr("abcdef", 0, 2) 343 print "xx" substr("abcdef", 2.3, 2) 344 print "xx" substr("abcdef", -1, 2) 345 print "xx" substr("abcdef", 1, 0) 346 print "xx" substr("abcdef", 1, -3) 347 print "xx" substr("abcdef", 1, 2.3) 348 print "xx" substr("", 1, 2) 349 print "xx" substr("abcdef", 5, 5) 350 print "xx" substr("abcdef", 7, 2) 351 exit (0) 352}' > $TEMP2 353diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk substr' 354 355# fldchg: 356echo 'aa aab c d e f' > $TEMP0 357echo '1: + +b c d e f 3582: + +b <c> d e f 3592a:%+%+b%<c>%d%e' > $TEMP1 360$AWK '{ gsub("aa", "+") 361 print "1:", $0 362 $3 = "<" $3 ">" 363 print "2:", $0 364 print "2a:" "%" $1 "%" $2 "%" $3 "%" $4 "%" $5 365}' $TEMP0 > $TEMP2 366diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk fldchg' 367 368# fldchgnf: 369echo 'a b c d' > $TEMP0 370echo 'a::c:d 3714' > $TEMP1 372$AWK '{ OFS = ":"; $2 = ""; print $0; print NF }' $TEMP0 > $TEMP2 373diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk fldchgnf' 374 375# OFMT from arnold robbins 6/02: 376# 5.7 with OFMT = %0.f is 6 377echo '6' > $TEMP1 378$AWK 'BEGIN { 379 OFMT = "%.0f" 380 print 5.7 381}' > $TEMP2 382cmp -s $TEMP1 $TEMP2 || fail 'BAD: T.gawk ofmt' 383 384 385### don't know what this is supposed to do now. 386### # convfmt: 387### echo 'a = 123.46 388### a = 123.456 389### a = 123.456' > $TEMP1 390### $AWK 'BEGIN { 391### CONVFMT = "%2.2f" 392### a = 123.456 393### b = a "" # give a string value also 394### a += 0 # make a numeric only again 395### print "a = ", a 396### CONVFMT = "%.6g" 397### print "a = ", a 398### a += 0 # make a numeric only again 399### print "a = ", a # use a as string 400### }' > $TEMP2 401### diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk convfmt' 402 403exit $RESULT 404