1*9a7741deSElliott Hughes#!/bin/sh 2*9a7741deSElliott Hughes 3*9a7741deSElliott Hughesawk=${awk-../a.out} 4*9a7741deSElliott Hughes 5*9a7741deSElliott HughesWORKDIR=$(mktemp -d /tmp/nawktest.XXXXXX) 6*9a7741deSElliott Hughes 7*9a7741deSElliott HughesTEMP0=$WORKDIR/test.temp.0 8*9a7741deSElliott HughesTEMP1=$WORKDIR/test.temp.1 9*9a7741deSElliott HughesTEMP2=$WORKDIR/test.temp.2 10*9a7741deSElliott Hughes 11*9a7741deSElliott HughesRESULT=0 12*9a7741deSElliott Hughes 13*9a7741deSElliott Hughesfail() { 14*9a7741deSElliott Hughes echo "$1" >&2 15*9a7741deSElliott Hughes RESULT=1 16*9a7741deSElliott Hughes} 17*9a7741deSElliott Hughes 18*9a7741deSElliott Hughesecho T.split: misc tests of field splitting and split command 19*9a7741deSElliott Hughes 20*9a7741deSElliott Hughes$awk 'BEGIN { 21*9a7741deSElliott Hughes # Assign string to $0, then change FS. 22*9a7741deSElliott Hughes FS = ":" 23*9a7741deSElliott Hughes $0="a:bc:def" 24*9a7741deSElliott Hughes FS = "-" 25*9a7741deSElliott Hughes print FS, $1, NF 26*9a7741deSElliott Hughes 27*9a7741deSElliott Hughes # Assign number to $0, then change FS. 28*9a7741deSElliott Hughes FS = "2" 29*9a7741deSElliott Hughes $0=1212121 30*9a7741deSElliott Hughes FS="3" 31*9a7741deSElliott Hughes print FS, $1, NF 32*9a7741deSElliott Hughes}' > $TEMP1 33*9a7741deSElliott Hughesecho '- a 3 34*9a7741deSElliott Hughes3 1 4' > $TEMP2 35*9a7741deSElliott Hughesdiff $TEMP1 $TEMP2 || fail 'BAD: T.split 0.1' 36*9a7741deSElliott Hughes 37*9a7741deSElliott Hughes$awk 'BEGIN { 38*9a7741deSElliott Hughes # FS changes after getline. 39*9a7741deSElliott Hughes FS = ":" 40*9a7741deSElliott Hughes "echo a:bc:def" | getline 41*9a7741deSElliott Hughes FS = "-" 42*9a7741deSElliott Hughes print FS, $1, NF 43*9a7741deSElliott Hughes}' > $TEMP1 44*9a7741deSElliott Hughesecho '- a 3' > $TEMP2 45*9a7741deSElliott Hughesdiff $TEMP1 $TEMP2 || fail 'BAD: T.split 0.2' 46*9a7741deSElliott Hughes 47*9a7741deSElliott Hughesecho ' 48*9a7741deSElliott Hughesa 49*9a7741deSElliott Hughesa:b 50*9a7741deSElliott Hughesc:d:e 51*9a7741deSElliott Hughese:f:g:h' > $TEMP0 52*9a7741deSElliott Hughes$awk 'BEGIN { 53*9a7741deSElliott Hughes FS = ":" 54*9a7741deSElliott Hughes while (getline <"'$TEMP0'" > 0) 55*9a7741deSElliott Hughes print NF 56*9a7741deSElliott Hughes}' > $TEMP1 57*9a7741deSElliott Hughesecho '0 58*9a7741deSElliott Hughes1 59*9a7741deSElliott Hughes2 60*9a7741deSElliott Hughes3 61*9a7741deSElliott Hughes4' > $TEMP2 62*9a7741deSElliott Hughesdiff $TEMP1 $TEMP2 || fail 'BAD: T.split 0.3' 63*9a7741deSElliott Hughes 64*9a7741deSElliott Hughes# getline var shouldn't impact fields. 65*9a7741deSElliott Hughes 66*9a7741deSElliott Hughesecho 'f b a' > $TEMP0 67*9a7741deSElliott Hughes$awk '{ 68*9a7741deSElliott Hughes FS = ":" 69*9a7741deSElliott Hughes getline a < "/etc/passwd" 70*9a7741deSElliott Hughes print $1 71*9a7741deSElliott Hughes}' $TEMP0 > $TEMP1 72*9a7741deSElliott Hughesecho 'f' > $TEMP2 73*9a7741deSElliott Hughesdiff $TEMP1 $TEMP2 || fail 'BAD: T.split 0.4' 74*9a7741deSElliott Hughes 75*9a7741deSElliott Hughesecho 'a b c d 76*9a7741deSElliott Hughesfoo 77*9a7741deSElliott Hughese f g h i 78*9a7741deSElliott Hughesbar' > $TEMP0 79*9a7741deSElliott Hughes$awk '{ 80*9a7741deSElliott Hughes FS=":" 81*9a7741deSElliott Hughes getline v 82*9a7741deSElliott Hughes print $2, NF 83*9a7741deSElliott Hughes FS=" " 84*9a7741deSElliott Hughes}' $TEMP0 > $TEMP1 85*9a7741deSElliott Hughesecho 'b 4 86*9a7741deSElliott Hughesf 5' > $TEMP2 87*9a7741deSElliott Hughesdiff $TEMP1 $TEMP2 || fail 'BAD: T.split 0.5' 88*9a7741deSElliott Hughes 89*9a7741deSElliott Hughesecho 'a.b.c=d.e.f 90*9a7741deSElliott Hughesg.h.i=j.k.l 91*9a7741deSElliott Hughesm.n.o=p.q.r' > $TEMP0 92*9a7741deSElliott Hughesecho 'b 93*9a7741deSElliott Hughesh 94*9a7741deSElliott Hughesn' > $TEMP1 95*9a7741deSElliott Hughes$awk 'BEGIN { FS="=" } { FS="."; $0=$1; print $2; FS="="; }' $TEMP0 > $TEMP2 96*9a7741deSElliott Hughesdiff $TEMP1 $TEMP2 || fail 'BAD: T.split (record assignment 1)' 97*9a7741deSElliott Hughes 98*9a7741deSElliott Hughesecho 'a.b.c=d.e.f 99*9a7741deSElliott Hughesg.h.i=j.k.l 100*9a7741deSElliott Hughesm.n.o=p.q.r' > $TEMP0 101*9a7741deSElliott Hughesecho 'd.e.f 102*9a7741deSElliott Hughesb 103*9a7741deSElliott Hughesj.k.l 104*9a7741deSElliott Hughesh 105*9a7741deSElliott Hughesp.q.r 106*9a7741deSElliott Hughesn' > $TEMP1 107*9a7741deSElliott Hughes$awk 'BEGIN { FS="=" } { print $2; FS="."; $0=$1; print $2; FS="="; }' $TEMP0 > $TEMP2 108*9a7741deSElliott Hughesdiff $TEMP1 $TEMP2 || fail 'BAD: T.split (record assignment 2)' 109*9a7741deSElliott Hughes 110*9a7741deSElliott Hughesecho 'abc 111*9a7741deSElliott Hughesde 112*9a7741deSElliott Hughesf 113*9a7741deSElliott Hughes 114*9a7741deSElliott Hughes ' > $TEMP0 115*9a7741deSElliott Hugheswho | sed 10q >> $TEMP0 116*9a7741deSElliott Hughessed 10q /etc/passwd >> $TEMP0 117*9a7741deSElliott Hughes 118*9a7741deSElliott Hughes$awk ' 119*9a7741deSElliott Hughes{ n = split($0, x, "") 120*9a7741deSElliott Hughes m = length($0) 121*9a7741deSElliott Hughes if (m != n) print "error 1", NR 122*9a7741deSElliott Hughes s = "" 123*9a7741deSElliott Hughes for (i = 1; i <= m; i++) 124*9a7741deSElliott Hughes s = s x[i] 125*9a7741deSElliott Hughes if (s != $0) print "error 2", NR 126*9a7741deSElliott Hughes print s 127*9a7741deSElliott Hughes}' $TEMP0 > $TEMP1 128*9a7741deSElliott Hughes 129*9a7741deSElliott Hughesdiff $TEMP0 $TEMP1 || fail 'BAD: T.split 1' 130*9a7741deSElliott Hughes 131*9a7741deSElliott Hughes# assumes same test.temp.0! bad design 132*9a7741deSElliott Hughes 133*9a7741deSElliott Hughes 134*9a7741deSElliott Hughes$awk ' 135*9a7741deSElliott Hughes{ n = split($0, x, //) 136*9a7741deSElliott Hughes m = length($0) 137*9a7741deSElliott Hughes if (m != n) print "error 1", NR 138*9a7741deSElliott Hughes s = "" 139*9a7741deSElliott Hughes for (i = 1; i <= m; i++) 140*9a7741deSElliott Hughes s = s x[i] 141*9a7741deSElliott Hughes if (s != $0) print "error 2", NR 142*9a7741deSElliott Hughes print s 143*9a7741deSElliott Hughes}' $TEMP0 > $TEMP1 144*9a7741deSElliott Hughes 145*9a7741deSElliott Hughesdiff $TEMP0 $TEMP1 || fail 'BAD: T.split //' 146*9a7741deSElliott Hughes 147*9a7741deSElliott Hughes$awk ' 148*9a7741deSElliott HughesBEGIN { FS = "" } 149*9a7741deSElliott Hughes{ n = split($0, x) # will be split with FS 150*9a7741deSElliott Hughes m = length($0) 151*9a7741deSElliott Hughes if (m != n) print "error 1", NR 152*9a7741deSElliott Hughes s = "" 153*9a7741deSElliott Hughes for (i = 1; i <= m; i++) 154*9a7741deSElliott Hughes s = s x[i] 155*9a7741deSElliott Hughes if (s != $0) print "error 2", NR 156*9a7741deSElliott Hughes print s 157*9a7741deSElliott Hughes}' $TEMP0 > $TEMP2 158*9a7741deSElliott Hughes 159*9a7741deSElliott Hughesdiff $TEMP0 $TEMP2 || fail 'BAD: T.split 2' 160*9a7741deSElliott Hughes 161*9a7741deSElliott Hughes# assumes same test.temp.0! 162*9a7741deSElliott Hughes 163*9a7741deSElliott Hughes$awk ' 164*9a7741deSElliott HughesBEGIN { FS = "" } 165*9a7741deSElliott Hughes{ n = NF 166*9a7741deSElliott Hughes m = length($0) 167*9a7741deSElliott Hughes if (m != n) print "error 1", NR 168*9a7741deSElliott Hughes s = "" 169*9a7741deSElliott Hughes for (i = 1; i <= m; i++) 170*9a7741deSElliott Hughes s = s $i 171*9a7741deSElliott Hughes if (s != $0) print "error 2", NR 172*9a7741deSElliott Hughes print s 173*9a7741deSElliott Hughes}' $TEMP0 > $TEMP2 174*9a7741deSElliott Hughes 175*9a7741deSElliott Hughesdiff $TEMP0 $TEMP2 || fail 'BAD: T.split 3' 176*9a7741deSElliott Hughes 177*9a7741deSElliott Hughes 178*9a7741deSElliott Hughes$awk ' 179*9a7741deSElliott Hughes{ n = split( $0, temp, /^@@@ +/ ) 180*9a7741deSElliott Hughes print n 181*9a7741deSElliott Hughes}' > $TEMP1 <<XXX 182*9a7741deSElliott Hughes@@@ xxx 183*9a7741deSElliott Hughes@@@ xxx 184*9a7741deSElliott Hughes@@@ xxx 185*9a7741deSElliott HughesXXX 186*9a7741deSElliott Hughesecho '2 187*9a7741deSElliott Hughes2 188*9a7741deSElliott Hughes2' > $TEMP2 189*9a7741deSElliott Hughesdiff $TEMP1 $TEMP2 || fail 'BAD: T.split 4' 190*9a7741deSElliott Hughes 191*9a7741deSElliott Hughesrm -f $WORKDIR/test.temp* 192*9a7741deSElliott Hughes 193*9a7741deSElliott Hughesecho ' 194*9a7741deSElliott Hughesa 195*9a7741deSElliott Hughesbc 196*9a7741deSElliott Hughesdef' > $TEMP0 197*9a7741deSElliott Hughes$awk ' 198*9a7741deSElliott Hughes{ print split($0, x, "") 199*9a7741deSElliott Hughes}' $TEMP0 > $TEMP1 200*9a7741deSElliott Hughesecho '0 201*9a7741deSElliott Hughes1 202*9a7741deSElliott Hughes2 203*9a7741deSElliott Hughes3' > $TEMP2 204*9a7741deSElliott Hughesdiff $TEMP1 $TEMP2 || fail 'BAD: T.split null 3rd arg' 205*9a7741deSElliott Hughes 206*9a7741deSElliott Hughesrm -f $WORKDIR/test.temp* 207*9a7741deSElliott Hughes$awk 'BEGIN { 208*9a7741deSElliott Hughes a[1]="a b" 209*9a7741deSElliott Hughes print split(a[1],a),a[1],a[2] 210*9a7741deSElliott Hughes}' > $TEMP1 211*9a7741deSElliott Hughes 212*9a7741deSElliott Hughesecho '2 a b' > $TEMP2 213*9a7741deSElliott Hughesdiff $TEMP1 $TEMP2 || fail 'BAD: T.split(a[1],a)' 214*9a7741deSElliott Hughes 215*9a7741deSElliott Hughes$awk 'BEGIN { 216*9a7741deSElliott Hughes a = "cat\n\n\ndog" 217*9a7741deSElliott Hughes split(a, b, "[\r\n]+") 218*9a7741deSElliott Hughes print b[1], b[2] 219*9a7741deSElliott Hughes}' > $TEMP1 220*9a7741deSElliott Hughesecho 'cat dog' > $TEMP2 221*9a7741deSElliott Hughesdiff $TEMP1 $TEMP2 || fail 'BAD: T.split(a, b, "[\r\n]+")' 222*9a7741deSElliott Hughes 223*9a7741deSElliott Hughesrm -rf $WORKDIR 224*9a7741deSElliott Hughes 225*9a7741deSElliott Hughesexit $RESULT 226