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.split: misc tests of field splitting and split command 20 21$AWK 'BEGIN { 22 # Assign string to $0, then change FS. 23 FS = ":"; 24 $0="a:bc:def"; 25 FS = "-"; 26 print FS, $1, NF; 27 28 # Assign number to $0, then change FS. 29 FS = "2"; 30 $0=1212121; 31 FS="3"; 32 print FS, $1, NF; 33}' > $TEMP1 34echo '- a 3 353 1 4' > $TEMP2 36diff $TEMP1 $TEMP2 || fail 'BAD: T.split 0.1' 37 38$AWK 'BEGIN { 39 # FS changes after getline. 40 FS = ":"; 41 "echo a:bc:def" | getline; 42 FS = "-"; 43 print FS, $1, NF; 44}' > $TEMP1 45echo '- a 3' > $TEMP2 46diff $TEMP1 $TEMP2 || fail 'BAD: T.split 0.2' 47 48echo ' 49a 50a:b 51c:d:e 52e:f:g:h' > $TEMP0 53$AWK 'BEGIN { 54 FS = ":" 55 while (getline <"'$TEMP0'" > 0) 56 print NF 57}' > $TEMP1 58echo '0 591 602 613 624' > $TEMP2 63diff $TEMP1 $TEMP2 || fail 'BAD: T.split 0.3' 64 65# getline var shouldn't impact fields. 66 67echo 'f b a' > $TEMP0 68$AWK '{ 69 FS = ":"; 70 getline a < "/etc/passwd"; 71 print $1; 72}' $TEMP0 > $TEMP1 73echo 'f' > $TEMP2 74diff $TEMP1 $TEMP2 || fail 'BAD: T.split 0.4' 75 76echo 'a b c d 77foo 78e f g h i 79bar' > $TEMP0 80$AWK '{ 81 FS=":"; 82 getline v; 83 print $2, NF; 84 FS=" "; 85}' $TEMP0 > $TEMP1 86echo 'b 4 87f 5' > $TEMP2 88diff $TEMP1 $TEMP2 || fail 'BAD: T.split 0.5' 89 90echo 'a.b.c=d.e.f 91g.h.i=j.k.l 92m.n.o=p.q.r' > $TEMP0 93echo 'b 94h 95n' > $TEMP1 96$AWK 'BEGIN { FS="=" } { FS="."; $0=$1; print $2; FS="="; }' $TEMP0 > $TEMP2 97diff $TEMP1 $TEMP2 || fail 'BAD: T.split (record assignment 1)' 98 99echo 'a.b.c=d.e.f 100g.h.i=j.k.l 101m.n.o=p.q.r' > $TEMP0 102echo 'd.e.f 103b 104j.k.l 105h 106p.q.r 107n' > $TEMP1 108$AWK 'BEGIN { FS="=" } { print $2; FS="."; $0=$1; print $2; FS="="; }' $TEMP0 > $TEMP2 109diff $TEMP1 $TEMP2 || fail 'BAD: T.split (record assignment 2)' 110 111echo 'abc 112de 113f 114 115 ' > $TEMP0 116who | sed 10q >> $TEMP0 117sed 10q /etc/passwd >> $TEMP0 118 119$AWK ' 120{ n = split($0, x, "") 121 m = length($0) 122 if (m != n) print "error 1", NR 123 s = "" 124 for (i = 1; i <= m; i++) 125 s = s x[i] 126 if (s != $0) print "error 2", NR 127 print s 128}' $TEMP0 > $TEMP1 129 130diff $TEMP0 $TEMP1 || fail 'BAD: T.split 1' 131 132# assumes same test.temp.0! bad design 133 134 135$AWK ' 136{ n = split($0, x, //) 137 m = length($0) 138 if (m != n) print "error 1", NR 139 s = "" 140 for (i = 1; i <= m; i++) 141 s = s x[i] 142 if (s != $0) print "error 2", NR 143 print s 144}' $TEMP0 > $TEMP1 145 146diff $TEMP0 $TEMP1 || fail 'BAD: T.split //' 147 148$AWK ' 149BEGIN { FS = "" } 150{ n = split($0, x) # will be split with FS 151 m = length($0) 152 if (m != n) print "error 1", NR 153 s = "" 154 for (i = 1; i <= m; i++) 155 s = s x[i] 156 if (s != $0) print "error 2", NR 157 print s 158}' $TEMP0 > $TEMP2 159 160diff $TEMP0 $TEMP2 || fail 'BAD: T.split 2' 161 162# assumes same test.temp.0! 163 164$AWK ' 165BEGIN { FS = "" } 166{ n = NF 167 m = length($0) 168 if (m != n) print "error 1", NR 169 s = "" 170 for (i = 1; i <= m; i++) 171 s = s $i 172 if (s != $0) print "error 2", NR 173 print s 174}' $TEMP0 > $TEMP2 175 176diff $TEMP0 $TEMP2 || fail 'BAD: T.split 3' 177 178 179$AWK ' 180{ n = split( $0, temp, /^@@@ +/ ) 181 print n 182}' > $TEMP1 <<XXX 183@@@ xxx 184@@@ xxx 185@@@ xxx 186XXX 187echo '2 1882 1892' > $TEMP2 190diff $TEMP1 $TEMP2 || fail 'BAD: T.split 4' 191 192rm -f $WORKDIR/test.temp* 193 194echo ' 195a 196bc 197def' > $TEMP0 198$AWK ' 199{ print split($0, x, "") 200}' $TEMP0 > $TEMP1 201echo '0 2021 2032 2043' > $TEMP2 205diff $TEMP1 $TEMP2 || fail 'BAD: T.split null 3rd arg' 206 207rm -f $WORKDIR/test.temp* 208$AWK 'BEGIN { 209 a[1]="a b" 210 print split(a[1],a),a[1],a[2] 211}' > $TEMP1 212 213echo '2 a b' > $TEMP2 214diff $TEMP1 $TEMP2 || fail 'BAD: T.split(a[1],a)' 215 216$AWK 'BEGIN { 217 a = "cat\n\n\ndog"; 218 split(a, b, "[\r\n]+"); 219 print b[1], b[2]; 220}' > $TEMP1 221echo 'cat dog' > $TEMP2 222diff $TEMP1 $TEMP2 || fail 'BAD: T.split(a, b, "[\r\n]+")' 223 224 225exit $RESULT 226