xref: /aosp_15_r20/external/one-true-awk/testdir/T.split (revision 9a7741de182b2776d7b30d6355f2585c0780a51b)
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