xref: /aosp_15_r20/external/toybox/tests/awk.test (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1*cf5a6c84SAndroid Build Coastguard Worker#!/bin/bash
2*cf5a6c84SAndroid Build Coastguard Worker
3*cf5a6c84SAndroid Build Coastguard Worker# Original found at http://lists.landley.net/pipermail/toybox-landley.net/2015-March/015201.html
4*cf5a6c84SAndroid Build Coastguard Worker
5*cf5a6c84SAndroid Build Coastguard Worker# Copyright 2015 Divya Kothari <[email protected]>
6*cf5a6c84SAndroid Build Coastguard Worker
7*cf5a6c84SAndroid Build Coastguard Worker# 2023: A few mods by Ray Gardner <[email protected]>
8*cf5a6c84SAndroid Build Coastguard Worker#   See "awk -f test04.awk" near line 170
9*cf5a6c84SAndroid Build Coastguard Worker#   and "awk -e ..." tests near line 415
10*cf5a6c84SAndroid Build Coastguard Worker# 2024: Mods to use testcmd instead of testing for most tests
11*cf5a6c84SAndroid Build Coastguard Worker#       Added new tests (after line 420)
12*cf5a6c84SAndroid Build Coastguard Worker
13*cf5a6c84SAndroid Build Coastguard Worker[ -f testing.sh ] && . testing.sh
14*cf5a6c84SAndroid Build Coastguard Worker
15*cf5a6c84SAndroid Build Coastguard Worker#testcmd "name" "command" "result" "infile" "stdin"
16*cf5a6c84SAndroid Build Coastguard Worker#testing "name" "progname command" "result" "infile" "stdin"
17*cf5a6c84SAndroid Build Coastguard Worker
18*cf5a6c84SAndroid Build Coastguard WorkerFILE1="abc def ghi 5\nghi jkl mno 10\nmno pqr stu 15\nstu vwx abc 20\n"
19*cf5a6c84SAndroid Build Coastguard WorkerFILE2="abc,def,ghi,5\nghi,jkl,mno,10\nmno,pqr,stu,15\nstu,vwx,abc,20\n"
20*cf5a6c84SAndroid Build Coastguard WorkerFILE3="abc:def:ghi:5\nghi:jkl:mno:10\nmno:pqr:stu:15\nstu:vwx:abc:20\n"
21*cf5a6c84SAndroid Build Coastguard WorkerFILE4="abc def ghi -5\nghi jkl mno -10\nmno pqr stu -15\nstu vwx abc -20\n"
22*cf5a6c84SAndroid Build Coastguard Worker
23*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk PATTERN input" "'/abc/' input" \
24*cf5a6c84SAndroid Build Coastguard Worker  "abc def ghi 5\nstu vwx abc 20\n" "$FILE1" ""
25*cf5a6c84SAndroid Build Coastguard Worker
26*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk SUBPATTERN input" "'/ab/' input" \
27*cf5a6c84SAndroid Build Coastguard Worker  "abc def ghi 5\nstu vwx abc 20\n" "$FILE1" ""
28*cf5a6c84SAndroid Build Coastguard Worker
29*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk FIELD input" "'{print \$2,\$3}' input" \
30*cf5a6c84SAndroid Build Coastguard Worker  "def ghi\njkl mno\npqr stu\nvwx abc\n" "$FILE1" ""
31*cf5a6c84SAndroid Build Coastguard Worker
32*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk FIELD input (out range)" "'{print \$2,\$8}' input" \
33*cf5a6c84SAndroid Build Coastguard Worker  "def \njkl \npqr \nvwx \n" "$FILE1" ""
34*cf5a6c84SAndroid Build Coastguard Worker
35*cf5a6c84SAndroid Build Coastguard WorkerL1="def def def def def def def def def def"
36*cf5a6c84SAndroid Build Coastguard WorkerL2="jkl jkl jkl jkl jkl jkl jkl jkl jkl jkl"
37*cf5a6c84SAndroid Build Coastguard WorkerL3="pqr pqr pqr pqr pqr pqr pqr pqr pqr pqr"
38*cf5a6c84SAndroid Build Coastguard WorkerL4="vwx vwx vwx vwx vwx vwx vwx vwx vwx vwx"
39*cf5a6c84SAndroid Build Coastguard Workertesting "awk FIELD input (single, multiple times)" \
40*cf5a6c84SAndroid Build Coastguard Worker  "awk '{ print \$2,\$2,\$2,\$2,\$2,\$2,\$2,\$2,\$2,\$2 }' input" \
41*cf5a6c84SAndroid Build Coastguard Worker  "$L1\n$L2\n$L3\n$L4\n" "$FILE1" ""
42*cf5a6c84SAndroid Build Coastguard Worker
43*cf5a6c84SAndroid Build Coastguard Worker
44*cf5a6c84SAndroid Build Coastguard WorkerHEAD="Head1\tHead2\tHead3"
45*cf5a6c84SAndroid Build Coastguard WorkerFOOT="Report Generated"
46*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk CODE input" "'BEGIN { print \"$HEAD\"; } {
47*cf5a6c84SAndroid Build Coastguard Worker   print \$1,\"\t\",\$3; } END { print \"$FOOT\"; }' input" \
48*cf5a6c84SAndroid Build Coastguard Worker  "$HEAD\nabc \t ghi\nghi \t mno\nmno \t stu\nstu \t abc\n$FOOT\n" "$FILE1" ""
49*cf5a6c84SAndroid Build Coastguard Worker
50*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk '>' input" "'\$4>0' input" \
51*cf5a6c84SAndroid Build Coastguard Worker  "abc def ghi 5\nghi jkl mno 10\nmno pqr stu 15\nstu vwx abc 20\n" "$FILE1" ""
52*cf5a6c84SAndroid Build Coastguard Worker
53*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk '<' input" "'\$4<25' input" \
54*cf5a6c84SAndroid Build Coastguard Worker  "abc def ghi 5\nghi jkl mno 10\nmno pqr stu 15\nstu vwx abc 20\n" "$FILE1" ""
55*cf5a6c84SAndroid Build Coastguard Worker
56*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk '==' input" "'\$4==15' input" "mno pqr stu 15\n" "$FILE1" ""
57*cf5a6c84SAndroid Build Coastguard Worker
58*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk CMP input" "'\$1~/abc/' input" "abc def ghi 5\n" "$FILE1" ""
59*cf5a6c84SAndroid Build Coastguard Worker
60*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk COUNT input" "'BEGIN { count=0; } \$1~/abc/ { count++; } END {
61*cf5a6c84SAndroid Build Coastguard Worker   print \"Total Count =\",count; }' input" "Total Count = 1\n" "$FILE1" ""
62*cf5a6c84SAndroid Build Coastguard Worker
63*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk COLUMN input" "'{ print \$1 }' input" "abc\nghi\nmno\nstu\n" \
64*cf5a6c84SAndroid Build Coastguard Worker  "$FILE1" ""
65*cf5a6c84SAndroid Build Coastguard Worker
66*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk SUM input" "'BEGIN { sum=0; } { sum=sum+\$4; } END {
67*cf5a6c84SAndroid Build Coastguard Worker   print \"Sum is =\",sum; }' input" "Sum is = 50\n" "$FILE1" ""
68*cf5a6c84SAndroid Build Coastguard Worker
69*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk IF input" "'{ if(\$2 == \"jkl\") print \$1; }' input" "ghi\n" \
70*cf5a6c84SAndroid Build Coastguard Worker  "$FILE1" ""
71*cf5a6c84SAndroid Build Coastguard Worker
72*cf5a6c84SAndroid Build Coastguard Workertesting "awk FOR MUL input" \
73*cf5a6c84SAndroid Build Coastguard Worker  "awk 'BEGIN { for(i=1;i<=3;i++) print \"square of\", i, \"is\",i*i; }'" \
74*cf5a6c84SAndroid Build Coastguard Worker  "square of 1 is 1\nsquare of 2 is 4\nsquare of 3 is 9\n" "" ""
75*cf5a6c84SAndroid Build Coastguard Worker
76*cf5a6c84SAndroid Build Coastguard Workertesting "awk FOR ADD input" \
77*cf5a6c84SAndroid Build Coastguard Worker  "awk 'BEGIN { for(i=1;i<=3;i++) print \"twice of\", i, \"is\",i+i; }'" \
78*cf5a6c84SAndroid Build Coastguard Worker  "twice of 1 is 2\ntwice of 2 is 4\ntwice of 3 is 6\n" "" ""
79*cf5a6c84SAndroid Build Coastguard Worker
80*cf5a6c84SAndroid Build Coastguard Workertesting "awk FOR SUB input" \
81*cf5a6c84SAndroid Build Coastguard Worker  "awk 'BEGIN { for(i=1;i<=3;i++) print \"sub of\", i, \"is\",i-i; }'" \
82*cf5a6c84SAndroid Build Coastguard Worker  "sub of 1 is 0\nsub of 2 is 0\nsub of 3 is 0\n" "" ""
83*cf5a6c84SAndroid Build Coastguard Worker
84*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk {FS:invalid} input1" "'BEGIN { FS=\"69793793\" } { print \$2
85*cf5a6c84SAndroid Build Coastguard Worker   }' input" "\n\n\n\n" "$FILE3" ""
86*cf5a6c84SAndroid Build Coastguard Worker
87*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -F invalid input1" "-F69793793 '{ print \$2 }' input" \
88*cf5a6c84SAndroid Build Coastguard Worker  "\n\n\n\n" "$FILE3" ""
89*cf5a6c84SAndroid Build Coastguard Worker
90*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk {FS} input2" "'BEGIN { FS=\",\" } { print \$2 }' input" \
91*cf5a6c84SAndroid Build Coastguard Worker  "def\njkl\npqr\nvwx\n" "$FILE2" ""
92*cf5a6c84SAndroid Build Coastguard Worker
93*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -F input2" "-F\",\" '{ print \$2 }' input" \
94*cf5a6c84SAndroid Build Coastguard Worker  "def\njkl\npqr\nvwx\n" "$FILE2" ""
95*cf5a6c84SAndroid Build Coastguard Worker
96*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk {FS} input3" "'BEGIN { FS=\":\" } { print \$2 }' input" \
97*cf5a6c84SAndroid Build Coastguard Worker  "def\njkl\npqr\nvwx\n" "$FILE3" ""
98*cf5a6c84SAndroid Build Coastguard Worker
99*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -F input3" "-F: '{ print \$2 }' input" "def\njkl\npqr\nvwx\n" \
100*cf5a6c84SAndroid Build Coastguard Worker  "$FILE3" ""
101*cf5a6c84SAndroid Build Coastguard Worker
102*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk {OFS} {1} input" "'BEGIN { OFS=\"__\" } { print \$2 }' input" \
103*cf5a6c84SAndroid Build Coastguard Worker  "def\njkl\npqr\nvwx\n" "$FILE1" ""
104*cf5a6c84SAndroid Build Coastguard Worker
105*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk {OFS} {1,2} input" "'BEGIN { OFS=\"__\" } { print \$2,\$3
106*cf5a6c84SAndroid Build Coastguard Worker   }' input" "def__ghi\njkl__mno\npqr__stu\nvwx__abc\n" "$FILE1" ""
107*cf5a6c84SAndroid Build Coastguard Worker
108*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk {NF} input" "'{print NF}' input" "4\n4\n4\n4\n" "$FILE1" ""
109*cf5a6c84SAndroid Build Coastguard Worker
110*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk {NR} input" "'{print NR}' input" "1\n2\n3\n4\n" "$FILE1" ""
111*cf5a6c84SAndroid Build Coastguard Worker
112*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk END{NR} input" "'END {print NR}' input" "4\n" "$FILE1" ""
113*cf5a6c84SAndroid Build Coastguard Worker
114*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk SPLIT input" "'{ split(\$0,arr,\" \"); if(arr[3] == \"abc\")
115*cf5a6c84SAndroid Build Coastguard Worker   print \$2 }' input" "vwx\n" "$FILE1" ""
116*cf5a6c84SAndroid Build Coastguard Worker
117*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk SUBSTR input" "'{if (substr(\$0,1,3) == \"abc\") { print \$3 }
118*cf5a6c84SAndroid Build Coastguard Worker   }' input" "ghi\n" "$FILE1" ""
119*cf5a6c84SAndroid Build Coastguard Worker
120*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk SEARCH {PRINT} input" "'/ghi/ {print \$1,\$2,\$3,\$4}' input" \
121*cf5a6c84SAndroid Build Coastguard Worker  "abc def ghi 5\nghi jkl mno 10\n" "$FILE1" ""
122*cf5a6c84SAndroid Build Coastguard Worker
123*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk SEARCH {PRINTF} input" "'/ghi/ { printf \$1 \$2 \$3 \$4
124*cf5a6c84SAndroid Build Coastguard Worker   }' input" "abcdefghi5ghijklmno10" "$FILE1" ""
125*cf5a6c84SAndroid Build Coastguard Worker
126*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk {PRINT with TAB} input" "'{print \$2,\"\t\",\$4}' input" \
127*cf5a6c84SAndroid Build Coastguard Worker  "def \t 5\njkl \t 10\npqr \t 15\nvwx \t 20\n" "$FILE1" ""
128*cf5a6c84SAndroid Build Coastguard Worker
129*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk {PRINT 2,4} input" "'{print \$2,\$4}' input" \
130*cf5a6c84SAndroid Build Coastguard Worker  "def 5\njkl 10\npqr 15\nvwx 20\n" "$FILE1" ""
131*cf5a6c84SAndroid Build Coastguard Worker
132*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk {PRINT 4,2} input" "'{print \$4,\$2}' input" \
133*cf5a6c84SAndroid Build Coastguard Worker  "5 def\n10 jkl\n15 pqr\n20 vwx\n" "$FILE1" ""
134*cf5a6c84SAndroid Build Coastguard Worker
135*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk {PRINT X,Y} input" "'{print \$6,\$9}' input" \
136*cf5a6c84SAndroid Build Coastguard Worker  " \n \n \n \n" "$FILE1" ""
137*cf5a6c84SAndroid Build Coastguard Worker
138*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk {PRINT} input" "'{ print }' input" "$FILE1" "$FILE1" ""
139*cf5a6c84SAndroid Build Coastguard Worker
140*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk INVALID_ARGS1 input" "'{ print x,y }' input" \
141*cf5a6c84SAndroid Build Coastguard Worker  " \n \n \n \n" "$FILE1" ""
142*cf5a6c84SAndroid Build Coastguard Worker
143*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk INVALID_ARGS2 input" "'{ print \$4,\$5 }' input" \
144*cf5a6c84SAndroid Build Coastguard Worker  "5 \n10 \n15 \n20 \n" "$FILE1" ""
145*cf5a6c84SAndroid Build Coastguard Worker
146*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk PATTERN input (not found)" "'/abcd/' input && echo 'yes'" \
147*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "$FILE1" ""
148*cf5a6c84SAndroid Build Coastguard Worker
149*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk {PATTERN:-ve} input" "'/-5/' input" "abc def ghi -5\n" \
150*cf5a6c84SAndroid Build Coastguard Worker  "$FILE4" ""
151*cf5a6c84SAndroid Build Coastguard Worker
152*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk FIELD input (high value)" "'{print \$99999}' input &&
153*cf5a6c84SAndroid Build Coastguard Worker   echo 'yes'" "\n\n\n\nyes\n" "$FILE1" ""
154*cf5a6c84SAndroid Build Coastguard Worker
155*cf5a6c84SAndroid Build Coastguard Worker#### Starting "-f file" tests ####
156*cf5a6c84SAndroid Build Coastguard Worker
157*cf5a6c84SAndroid Build Coastguard Workerecho "{ if (\$1 == \"#START\") { FS=\":\"; } else if (\$1 == \"#STOP\") {
158*cf5a6c84SAndroid Build Coastguard Worker  FS=\" \"; } else { print \$3 } }" > test.awk
159*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test01.awk" "-f test.awk input" \
160*cf5a6c84SAndroid Build Coastguard Worker  "ghi\nmno\nstu\nabc\n" "$FILE1" ""
161*cf5a6c84SAndroid Build Coastguard Worker
162*cf5a6c84SAndroid Build Coastguard Workerecho "BEGIN { i=1; while (i <= 5) { printf i \"-\" i*i \" \"; i=i+1; }
163*cf5a6c84SAndroid Build Coastguard Worker  for (i=1; i <= 5; i++) { printf i \"-\" i*i \" \"; } }" > test.awk
164*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test02.awk" "-f test.awk" \
165*cf5a6c84SAndroid Build Coastguard Worker  "1-1 2-4 3-9 4-16 5-25 1-1 2-4 3-9 4-16 5-25 " "" ""
166*cf5a6c84SAndroid Build Coastguard Worker
167*cf5a6c84SAndroid Build Coastguard Workerecho "BEGIN { print \"Start.\" } { print \$1,\"-\",\$1*\$1; }
168*cf5a6c84SAndroid Build Coastguard Worker  END { print \"End.\" }" > test.awk
169*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test03.awk" "-f test.awk" \
170*cf5a6c84SAndroid Build Coastguard Worker  "Start.\n5 - 25\n10 - 100\n15 - 225\n20 - 400\nEnd.\n" "" "5\n10\n15\n20\n"
171*cf5a6c84SAndroid Build Coastguard Worker
172*cf5a6c84SAndroid Build Coastguard Worker### echo "{ if ( \$0 ~ /:/ ) {FS=\":\";} else {FS=\" \";} print \$3 }" > test.awk
173*cf5a6c84SAndroid Build Coastguard Worker### testing "awk -f test04.awk" "awk -f test.awk input" \
174*cf5a6c84SAndroid Build Coastguard Worker###   "ghi\nmno\nstu\nabc\nghi\nmno\nstu\nabc\n" "$FILE1$FILE3" ""
175*cf5a6c84SAndroid Build Coastguard Worker
176*cf5a6c84SAndroid Build Coastguard Worker### TEST ERROR This test originally ended with:
177*cf5a6c84SAndroid Build Coastguard Worker###   "ghi\nmno\nstu\nabc\nghi\nmno\nstu\nabc\n" "$FILE1$FILE3" ""
178*cf5a6c84SAndroid Build Coastguard Worker### This is wrong; gawk/mawk/bbawk/bwk awk agree that second ghi should not appear.
179*cf5a6c84SAndroid Build Coastguard Worker### (My current version of goawk agrees with the "wrong" expected value;
180*cf5a6c84SAndroid Build Coastguard Worker###  I need to update to latest goawk and test again. rdg 2023-10-29)
181*cf5a6c84SAndroid Build Coastguard Workerecho "{ if ( \$0 ~ /:/ ) {FS=\":\";} else {FS=\" \";} print \$3 }" > test.awk
182*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test04.awk" "-f test.awk input" \
183*cf5a6c84SAndroid Build Coastguard Worker  "ghi\nmno\nstu\nabc\n\nmno\nstu\nabc\n" "$FILE1$FILE3" ""
184*cf5a6c84SAndroid Build Coastguard Worker
185*cf5a6c84SAndroid Build Coastguard Workerecho "BEGIN { lines=0; total=0; } { lines++; total+=\$1; } END {
186*cf5a6c84SAndroid Build Coastguard Worker  print \"Read:\",lines; print \"Total:\",total; if (lines > 0 ) {
187*cf5a6c84SAndroid Build Coastguard Worker  print \"Average:\", total/lines; } else { print \"0\"; } }" > test.awk
188*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test05.awk" "-f test.awk input" \
189*cf5a6c84SAndroid Build Coastguard Worker  "Read: 5\nTotal: 150\nAverage: 30\n" "10\n20\n30\n40\n50\n" ""
190*cf5a6c84SAndroid Build Coastguard Worker
191*cf5a6c84SAndroid Build Coastguard Workerecho "BEGIN{FS=\":\";}{if(\$2==\"pqr\"){print \"first one:\", \$1;}}" > test.awk
192*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test06.awk" "-f test.awk input" \
193*cf5a6c84SAndroid Build Coastguard Worker  "first one: mno\n" "$FILE3" ""
194*cf5a6c84SAndroid Build Coastguard Worker
195*cf5a6c84SAndroid Build Coastguard Workerecho "{ print \$2; FS=\":\"; print \$2 }" > test.awk
196*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test07.awk" "-f test.awk input" \
197*cf5a6c84SAndroid Build Coastguard Worker  "\n\njkl\njkl\npqr\npqr\nvwx\nvwx\n" "$FILE3" ""
198*cf5a6c84SAndroid Build Coastguard Worker
199*cf5a6c84SAndroid Build Coastguard Workerecho "BEGIN { FS=\":\"; OFS=\":\"; } { \$2=\"\"; print }" > test.awk
200*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test09.awk" "-f test.awk input" \
201*cf5a6c84SAndroid Build Coastguard Worker  "abc::ghi:5\nghi::mno:10\nmno::stu:15\nstu::abc:20\n" "$FILE3" ""
202*cf5a6c84SAndroid Build Coastguard Worker
203*cf5a6c84SAndroid Build Coastguard Workermkdir dir && touch dir/file && LLDATA="`ls -l dir`"
204*cf5a6c84SAndroid Build Coastguard Workerrm -rf dir
205*cf5a6c84SAndroid Build Coastguard Workerecho "{ if (NF==8) { print \$8; } else if (NF==9) { print \$9; } }" > test.awk
206*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test10.awk" "-f test.awk input" "file\n" "$LLDATA" ""
207*cf5a6c84SAndroid Build Coastguard Worker
208*cf5a6c84SAndroid Build Coastguard Workerecho "{ if (NR >= 1) { print NR;} }" > test.awk
209*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test11.awk" "-f test.awk input" "1\n2\n" "$LLDATA" ""
210*cf5a6c84SAndroid Build Coastguard Worker
211*cf5a6c84SAndroid Build Coastguard Workerecho "BEGIN { RS=\"\"; FS=\"\n\" } { print \$2,\$3; }" > test.awk
212*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test12.awk" "-f test.awk input" \
213*cf5a6c84SAndroid Build Coastguard Worker  "ghi jkl mno 10 mno pqr stu 15\n" "$FILE1" ""
214*cf5a6c84SAndroid Build Coastguard Worker
215*cf5a6c84SAndroid Build Coastguard WorkerL="abc\ndef\nghi\n5\nghi\njkl\nmno\n10\nmno\npqr\nstu\n15\nstu\nvwx\nabc\n20\n"
216*cf5a6c84SAndroid Build Coastguard Workerecho "BEGIN { RS=\" \"; } { print; }" > test.awk
217*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test13.awk" "-f test.awk input" "$L\n" "$FILE1" ""
218*cf5a6c84SAndroid Build Coastguard Worker
219*cf5a6c84SAndroid Build Coastguard WorkerL="abc def ghi 5\r\nghi jkl mno 10\r\nmno pqr stu 15\r\nstu vwx abc 20\r\n"
220*cf5a6c84SAndroid Build Coastguard Workerecho "BEGIN { ORS=\"\r\n\" } { print }" > test.awk
221*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test14.awk" "-f test.awk input" "$L" "$FILE1" ""
222*cf5a6c84SAndroid Build Coastguard Worker
223*cf5a6c84SAndroid Build Coastguard Workerecho "BEGIN { f=\"\"; }{ if(f != FILENAME){ f=FILENAME; print f }}" > test.awk
224*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test15.awk" "-f test.awk input" "input\n" "$FILE1" ""
225*cf5a6c84SAndroid Build Coastguard Worker
226*cf5a6c84SAndroid Build Coastguard Workerecho "{ if (NF == 6) { } else { if (FILENAME == \"-\" ) { print \"ERROR\",
227*cf5a6c84SAndroid Build Coastguard Worker  NR,\"line:\"; } else { print \"ERROR\",FILENAME,NR;}}}" > test.awk
228*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test16.awk" "-f test.awk input" \
229*cf5a6c84SAndroid Build Coastguard Worker  "ERROR input 1\nERROR input 2\nERROR input 3\nERROR input 4\n" "$FILE1" ""
230*cf5a6c84SAndroid Build Coastguard Worker
231*cf5a6c84SAndroid Build Coastguard Workerecho "BEGIN { number_of_users=0; } { if (NF>7) {
232*cf5a6c84SAndroid Build Coastguard Worker  user=0; for (i=1; i<=number_of_users; i++) { if (username[i] == \$3) { user=i;
233*cf5a6c84SAndroid Build Coastguard Worker  } } if (user == 0) { username[++number_of_users]=\$3; user=number_of_users; }
234*cf5a6c84SAndroid Build Coastguard Worker  count[user]++; } } END { for (i=1; i<=number_of_users; i++) {
235*cf5a6c84SAndroid Build Coastguard Worker  print count[i], username[i] } } " > test.awk
236*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test17.awk" "-f test.awk input" "1 $USER\n" "$LLDATA" ""
237*cf5a6c84SAndroid Build Coastguard Worker
238*cf5a6c84SAndroid Build Coastguard Workerecho "{ usrname[\$3]++;}END{for(i in usrname){print usrname[i],i;} }" > test.awk
239*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test18.awk" "-f test.awk input" "1 \n1 $USER\n" "$LLDATA" ""
240*cf5a6c84SAndroid Build Coastguard Worker
241*cf5a6c84SAndroid Build Coastguard Workerecho "{ if (NF>7) { username[\$3]++; } } END { for (i in username) {
242*cf5a6c84SAndroid Build Coastguard Worker  print username[i], i; } }" > test.awk
243*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test19.awk" "-f test.awk input" "1 $USER\n" "$LLDATA" ""
244*cf5a6c84SAndroid Build Coastguard Worker
245*cf5a6c84SAndroid Build Coastguard Workerecho "BEGIN { username[\"\"]=0; } { username[\$3]++; } END {
246*cf5a6c84SAndroid Build Coastguard Worker  for (i in username) { if (i != \"\") { print username[i], i; }}}" > test.awk
247*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test20.awk" "-f test.awk input" "1 $USER\n" "$LLDATA" ""
248*cf5a6c84SAndroid Build Coastguard Worker
249*cf5a6c84SAndroid Build Coastguard Workerecho "{ printf \"%5s %3d\n\", \$3, \$4; }" > test.awk
250*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test22.awk" "-f test.awk input" \
251*cf5a6c84SAndroid Build Coastguard Worker  "  ghi   5\n  mno  10\n  stu  15\n  abc  20\n" "$FILE1" ""
252*cf5a6c84SAndroid Build Coastguard Worker
253*cf5a6c84SAndroid Build Coastguard Workerecho "BEGIN { format1 =\"%8s %6sn\"; format2 =\"%8s %6dn\"; }
254*cf5a6c84SAndroid Build Coastguard Worker  { printf(format2, \$1, \$4); }" > test.awk
255*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test23.awk" "-f test.awk input" \
256*cf5a6c84SAndroid Build Coastguard Worker  "     abc      5n     ghi     10n     mno     15n     stu     20n" "$FILE1" ""
257*cf5a6c84SAndroid Build Coastguard Worker
258*cf5a6c84SAndroid Build Coastguard Workerecho "END { for (i=1;i<=2;i++) {
259*cf5a6c84SAndroid Build Coastguard Worker  printf(\"i=%d\n\", i) > \"ConcatedFile_a\" i; } }" > test.awk
260*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test24.awk" "-f test.awk && cat ConcatedFile_a1 &&
261*cf5a6c84SAndroid Build Coastguard Worker  cat ConcatedFile_a2 && rm -f ConcatedFile_a*" "i=1\ni=2\n" "" ""
262*cf5a6c84SAndroid Build Coastguard Worker
263*cf5a6c84SAndroid Build Coastguard WorkerL1="             abc def ghi 5\n"
264*cf5a6c84SAndroid Build Coastguard WorkerL2="            ghi jkl mno 10\n"
265*cf5a6c84SAndroid Build Coastguard WorkerL3="            mno pqr stu 15\n"
266*cf5a6c84SAndroid Build Coastguard WorkerL4="            stu vwx abc 20\n"
267*cf5a6c84SAndroid Build Coastguard Workerecho "{ if (length(\$0) < 80) { prefix = \"\";
268*cf5a6c84SAndroid Build Coastguard Worker  for (i = 1;i<(40-length(\$0))/2;i++) { prefix = prefix \" \" };
269*cf5a6c84SAndroid Build Coastguard Worker  print prefix \$0; } else { print; } }" > test.awk
270*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test26.awk" "-f test.awk input" "$L1$L2$L3$L4" "$FILE1" ""
271*cf5a6c84SAndroid Build Coastguard Worker
272*cf5a6c84SAndroid Build Coastguard Workerecho "{ line = \$0; while (substr(line,length(line),1) == \"\\\\\") {
273*cf5a6c84SAndroid Build Coastguard Worker  line = substr(line,1,length(line)-1); i=getline; if (i > 0) {
274*cf5a6c84SAndroid Build Coastguard Worker  line = line \$0; } else { printf(\"%d\", NR); } } print line; }" > test.awk
275*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test27.awk" "-f test.awk input" "$FILE1" "$FILE1" ""
276*cf5a6c84SAndroid Build Coastguard Worker
277*cf5a6c84SAndroid Build Coastguard Workerecho "BEGIN { for (x = 0; x <= 20; x++) { if (x == 5) { continue; }
278*cf5a6c84SAndroid Build Coastguard Worker  printf \"%d \",x } print \"\" }" > test.awk
279*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test28.awk" "-f test.awk" \
280*cf5a6c84SAndroid Build Coastguard Worker  "0 1 2 3 4 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \n" "" ""
281*cf5a6c84SAndroid Build Coastguard Worker
282*cf5a6c84SAndroid Build Coastguard Workerecho "{ i = 1; while (i <= 2) { print \$i; i++ } }" > test.awk
283*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test29.awk" "-f test.awk input" \
284*cf5a6c84SAndroid Build Coastguard Worker  "abc\ndef\nghi\njkl\nmno\npqr\nstu\nvwx\n" "$FILE1" ""
285*cf5a6c84SAndroid Build Coastguard Worker
286*cf5a6c84SAndroid Build Coastguard WorkerL1="abc def ghi 5\nabc def ghi 5\nabc def ghi 5\n"
287*cf5a6c84SAndroid Build Coastguard WorkerL2="ghi jkl mno 10\nghi jkl mno 10\nghi jkl mno 10\n"
288*cf5a6c84SAndroid Build Coastguard WorkerL3="mno pqr stu 15\nmno pqr stu 15\nmno pqr stu 15\n"
289*cf5a6c84SAndroid Build Coastguard WorkerL4="stu vwx abc 20\nstu vwx abc 20\nstu vwx abc 20\n"
290*cf5a6c84SAndroid Build Coastguard Workerecho "{ i = 1; do { print \$0; i++ } while (i <= 3) }" > test.awk
291*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test30.awk" "-f test.awk input" "$L1$L2$L3$L4" "$FILE1" ""
292*cf5a6c84SAndroid Build Coastguard Worker
293*cf5a6c84SAndroid Build Coastguard Workerecho "{ for (i = 1; i <= 3; i++) print \$i }" > test.awk
294*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test31.awk" "-f test.awk input" \
295*cf5a6c84SAndroid Build Coastguard Worker  "abc\ndef\nghi\nghi\njkl\nmno\nmno\npqr\nstu\nstu\nvwx\nabc\n" "$FILE1" ""
296*cf5a6c84SAndroid Build Coastguard Worker
297*cf5a6c84SAndroid Build Coastguard Workerecho "{ num = \$1; for (div = 2; div*div <= num; div++) { if (num % div == 0) {
298*cf5a6c84SAndroid Build Coastguard Worker  break } } if (num % div == 0) { printf \"divisor of %d is %d\n\", num, div }
299*cf5a6c84SAndroid Build Coastguard Worker  else { printf \"%d is prime\n\", num } }" > test.awk
300*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test32.awk" "-f test.awk input" \
301*cf5a6c84SAndroid Build Coastguard Worker  "divisor of 10 is 2\ndivisor of 15 is 3\n17 is prime\n" "10\n15\n17\n" ""
302*cf5a6c84SAndroid Build Coastguard Worker
303*cf5a6c84SAndroid Build Coastguard Worker# Mod in case prog name is not 'awk'
304*cf5a6c84SAndroid Build Coastguard Worker##  echo "BEGIN { for (i = 0; i < ARGC; i++) { print ARGV[i] } }" > test.awk
305*cf5a6c84SAndroid Build Coastguard Worker##  testcmd "awk -f test33.awk" "-f test.awk input1 input2 input3 input4" \
306*cf5a6c84SAndroid Build Coastguard Worker##    "awk\ninput1\ninput2\ninput3\ninput4\n" "$FILE1" ""
307*cf5a6c84SAndroid Build Coastguard Workerecho "BEGIN { for (i = 1; i < ARGC; i++) { print ARGV[i] } }" > test.awk
308*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test33.awk" "-f test.awk input1 input2 input3 input4" \
309*cf5a6c84SAndroid Build Coastguard Worker  "input1\ninput2\ninput3\ninput4\n" "$FILE1" ""
310*cf5a6c84SAndroid Build Coastguard Worker
311*cf5a6c84SAndroid Build Coastguard Workerecho "NR == 2 { NR = 17 } { print NR }" > test.awk
312*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test34.awk" "-f test.awk input" "1\n17\n18\n19\n" \
313*cf5a6c84SAndroid Build Coastguard Worker  "$FILE1" ""
314*cf5a6c84SAndroid Build Coastguard Worker
315*cf5a6c84SAndroid Build Coastguard Workerecho "BEGIN{n=0;}/abc/{++n;}END{print \"abc appears\",n,\"times\"}" > test.awk
316*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test35.awk" "-f test.awk input" "abc appears 2 times\n" \
317*cf5a6c84SAndroid Build Coastguard Worker  "$FILE1" ""
318*cf5a6c84SAndroid Build Coastguard Worker
319*cf5a6c84SAndroid Build Coastguard Workerecho "{ print \"Square root of\", \$1, \"is\", sqrt(\$1) }" > test.awk
320*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test36.awk" "-f test.awk input" \
321*cf5a6c84SAndroid Build Coastguard Worker  "Square root of 25 is 5\n" "25" ""
322*cf5a6c84SAndroid Build Coastguard Worker
323*cf5a6c84SAndroid Build Coastguard WorkerFILE5="foo bar 2500\nabc def 2400\n"
324*cf5a6c84SAndroid Build Coastguard Workerecho "\$1 == \"foo\" { print \$2 }" > test.awk
325*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test37.awk" "-f test.awk input" "bar\n" "$FILE5" ""
326*cf5a6c84SAndroid Build Coastguard Worker
327*cf5a6c84SAndroid Build Coastguard Workerecho "/2400/ && /foo/" > test.awk
328*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test38.awk" "-f test.awk input" "" "$FILE5" ""
329*cf5a6c84SAndroid Build Coastguard Worker
330*cf5a6c84SAndroid Build Coastguard Workerecho "/2400/ || /foo/" > test.awk
331*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test39.awk" "-f test.awk input" "$FILE5" "$FILE5" ""
332*cf5a6c84SAndroid Build Coastguard Worker
333*cf5a6c84SAndroid Build Coastguard Workerecho "! /foo/" > test.awk
334*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test40.awk" "-f test.awk input" "abc def 2400\n" "$FILE5" ""
335*cf5a6c84SAndroid Build Coastguard Worker
336*cf5a6c84SAndroid Build Coastguard Workerecho "\$1 ~ /foo/ { print \$2 }" > test.awk
337*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test41.awk" "-f test.awk input" "bar\n" "$FILE5" ""
338*cf5a6c84SAndroid Build Coastguard Worker
339*cf5a6c84SAndroid Build Coastguard Workerecho "{ if (! (\$0 ~ /foo/)) print }" > test.awk
340*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test42.awk" "-f test.awk input" "abc def 2400\n" "$FILE5" ""
341*cf5a6c84SAndroid Build Coastguard Worker
342*cf5a6c84SAndroid Build Coastguard WorkerFILE6="Pat 100 97 58\nSandy 84 72 93\nChris 72 92 89\n"
343*cf5a6c84SAndroid Build Coastguard Worker
344*cf5a6c84SAndroid Build Coastguard Workerecho "{ print \"F1:\", \$1 }" > test.awk
345*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test43.awk" "-f test.awk input" "F1: foo\nF1: abc\n" \
346*cf5a6c84SAndroid Build Coastguard Worker  "$FILE5" ""
347*cf5a6c84SAndroid Build Coastguard Worker
348*cf5a6c84SAndroid Build Coastguard Workerecho "{ sum = \$2 + \$3 + \$4 ; avg = sum / 3; print \$1, avg }" > test.awk
349*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test44.awk" "-f test.awk input" \
350*cf5a6c84SAndroid Build Coastguard Worker  "Pat 85\nSandy 83\nChris 84.3333\n" "$FILE6" ""
351*cf5a6c84SAndroid Build Coastguard Worker
352*cf5a6c84SAndroid Build Coastguard Workerecho "{ print \$1 > \"list1\"; print \$2 > \"list2\" }" > test.awk
353*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test45.awk" "-f test.awk input && cat list1 && cat list2" \
354*cf5a6c84SAndroid Build Coastguard Worker  "Pat\nSandy\nChris\n100\n84\n72\n" "$FILE6" ""
355*cf5a6c84SAndroid Build Coastguard Workerrm -f list1 list2
356*cf5a6c84SAndroid Build Coastguard Worker
357*cf5a6c84SAndroid Build Coastguard Workerecho "{ print \$(2*2) }" > test.awk
358*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test46.awk" "-f test.awk input" "58\n93\n89\n" "$FILE6" ""
359*cf5a6c84SAndroid Build Coastguard Worker
360*cf5a6c84SAndroid Build Coastguard Workerecho "{ sub(/a+/,\"<A>\"); print }" > test.awk
361*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test47.awk" "-f test.awk input" \
362*cf5a6c84SAndroid Build Coastguard Worker  "P<A>t 100 97 58\nS<A>ndy 84 72 93\nChris 72 92 89\n" "$FILE6" ""
363*cf5a6c84SAndroid Build Coastguard Worker
364*cf5a6c84SAndroid Build Coastguard Workerecho "{ l[lines] = \$0; ++lines } END { for (i = lines-1; i >= 0; --i) {
365*cf5a6c84SAndroid Build Coastguard Worker  print l[i]} }" > test.awk
366*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -f test48.awk" "-f test.awk input" \
367*cf5a6c84SAndroid Build Coastguard Worker  "Chris 72 92 89\nSandy 84 72 93\n\n" "$FILE6" ""
368*cf5a6c84SAndroid Build Coastguard Worker
369*cf5a6c84SAndroid Build Coastguard WorkerFILE7="Pat 100 97 58 77 89 11 45\nSandy 84 729\nChris 92 89\nsagar 22 2213\n"
370*cf5a6c84SAndroid Build Coastguard WorkerL1="Pat 100 97 58 77 89 11 45"
371*cf5a6c84SAndroid Build Coastguard WorkerL2="sagar 22 2213"
372*cf5a6c84SAndroid Build Coastguard WorkerL3="dd 335566778856"
373*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk Print line longer than 12" "'length(\$0) > 12' input" \
374*cf5a6c84SAndroid Build Coastguard Worker  "$L1\n$L2\n" "$FILE7" ""
375*cf5a6c84SAndroid Build Coastguard Worker
376*cf5a6c84SAndroid Build Coastguard WorkerFILE8="red apple blue berry green thumb"
377*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk Print first two field opposite order" "'{ print \$2, \$1 }' input" \
378*cf5a6c84SAndroid Build Coastguard Worker  "apple red\n" "$FILE8" ""
379*cf5a6c84SAndroid Build Coastguard Worker
380*cf5a6c84SAndroid Build Coastguard WorkerFILE9="1, Justin Timberlake, Title 545, Price $7.30\n2, Taylor Swift, Title 723, Price $7.90\n3, Mick Jagger, Title 610, Price $7.90\n4, Lady Gaga, Title 118, Price $7.30\n5, Johnny Cash, Title 482, Price $6.50\n6, Elvis Presley, Title 335, Price $7.30\n7, John Lennon, Title 271, Price $7.90\n8, Michael Jackson, Title 373, Price $5.50\n"
381*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk filter data" "'{ print \$5 }' input" \
382*cf5a6c84SAndroid Build Coastguard Worker  "545,\n723,\n610,\n118,\n482,\n335,\n271,\n373,\n" "$FILE9" ""
383*cf5a6c84SAndroid Build Coastguard Worker
384*cf5a6c84SAndroid Build Coastguard WorkerFILE10="abcd efgh ijkl mnop\nqrst uvwx yzab cdef\nghij klmn opqr stuv\nwxyz abcd efgh ijkl\nmnop qrst uvwx yz\n"
385*cf5a6c84SAndroid Build Coastguard WorkerL1="abcd efgh ijkl mnop"
386*cf5a6c84SAndroid Build Coastguard WorkerL2="wxyz abcd efgh ijkl"
387*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk print selected lines" "'/abcd/' input" \
388*cf5a6c84SAndroid Build Coastguard Worker   "$L1\n$L2\n" "$FILE10" ""
389*cf5a6c84SAndroid Build Coastguard WorkerL1="efgh mnop"
390*cf5a6c84SAndroid Build Coastguard WorkerL2="uvwx cdef"
391*cf5a6c84SAndroid Build Coastguard WorkerL3="klmn stuv"
392*cf5a6c84SAndroid Build Coastguard WorkerL4="abcd ijkl"
393*cf5a6c84SAndroid Build Coastguard WorkerL5="qrst yz"
394*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk print selected fields" "'{print \$2, \$4}' input" \
395*cf5a6c84SAndroid Build Coastguard Worker   "$L1\n$L2\n$L3\n$L4\n$L5\n" "$FILE10" ""
396*cf5a6c84SAndroid Build Coastguard Worker
397*cf5a6c84SAndroid Build Coastguard WorkerFILE11="abcd efgh ijkl mnop 4\nqrst uvwx yzab cdef 6\nghij klmn opqr stuv 0\nwxyz abcd efgh ijkl 1\nmnop qrst uvwx yz 2\n"
398*cf5a6c84SAndroid Build Coastguard WorkerFILE12="abcd\efgh\ijkl\mnop\4\nqrst\uvwx\yzab\cdef\6\nghij\klmn\opqr\stuv\0\nwxyz\abcd\efgh\ijkl\1\nmnop\qrst\uvwx\yz\2\n"
399*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk FS" "'BEGIN {FS=k;lksa;lkf;l} {print \$2}' input" "b\nr\nh\nx\nn\n" "$FILE11" ""
400*cf5a6c84SAndroid Build Coastguard Worker
401*cf5a6c84SAndroid Build Coastguard Workerecho "{ if (\$1 == \"#START\") { FS=\":\"; } else if (\$1 == \"#STOP\") {
402*cf5a6c84SAndroid Build Coastguard Worker  FS=\" \"; } else { print \$3 } }" > test.awk
403*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -v var=val -f test.awk" "-v var=2 -f test.awk input" \
404*cf5a6c84SAndroid Build Coastguard Worker  "ghi\nmno\nstu\nabc\nghi\nmno\nstu\nabc\n" "$FILE1$FILE4" ""
405*cf5a6c84SAndroid Build Coastguard Worker
406*cf5a6c84SAndroid Build Coastguard Workerecho -e "abc def ghi 5\nghi jkl mno 10\nmno pqr stu 15\nstu vwx abc 20\n" > testfile1.txt
407*cf5a6c84SAndroid Build Coastguard Workerecho -e "abc,def,ghi,5\nghi,jkl,mno,10\nmno,pqr,stu,15\nstu,vwx,abc,20\n" > testfile2.txt
408*cf5a6c84SAndroid Build Coastguard Workerecho "{ if (\$1 == \"#START\") { FS=\":\"; } else if (\$1 == \"#STOP\") {
409*cf5a6c84SAndroid Build Coastguard Worker  FS=\" \"; } else { print \$3 } }" > test.awk
410*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -v myvar=val -f file1 file" "-v myvar=$2 -f test.awk testfile1.txt testfile2.txt" "ghi\nmno\nstu\nabc\n\n\n\n\n\n\n" "" ""
411*cf5a6c84SAndroid Build Coastguard Worker
412*cf5a6c84SAndroid Build Coastguard Worker### The -e option is non-standard. gawk and bbawk accept it; mawk and goawk do not, bwk awk says unknown option -e ignored but continues
413*cf5a6c84SAndroid Build Coastguard Worker### bbawk does nothing useful with it: accepts -f and -e but runs the -e code out of order.
414*cf5a6c84SAndroid Build Coastguard Worker### Correction: bbawk does do -e correctly now (since about December 2023?)
415*cf5a6c84SAndroid Build Coastguard Worker
416*cf5a6c84SAndroid Build Coastguard Worker###testing "awk -e print print ARGC file1 file2" "awk -e '{ print \$1; print ARGC }' testfile1.txt testfile2.txt" "abc\n3\nghi\n3\nmno\n3\nstu\n3\n\n3\nabc,def,ghi,5\n3\nghi,jkl,mno,10\n3\nmno,pqr,stu,15\n3\nstu,vwx,abc,20\n3\n\n3\n" "" ""
417*cf5a6c84SAndroid Build Coastguard Worker###testing "awk -e print ARGC file" "awk -e '{ print ARGC }' testfile1.txt" "2\n2\n2\n2\n2\n" "$FILE1" ""
418*cf5a6c84SAndroid Build Coastguard Worker###testing "awk -e print print ARGC input" "awk -e '{ print \$1; print ARGC }' input" "abc\n2\nghi\n2\nmno\n2\nstu\n2\n" "$FILE1" ""
419*cf5a6c84SAndroid Build Coastguard Worker
420*cf5a6c84SAndroid Build Coastguard Worker
421*cf5a6c84SAndroid Build Coastguard Worker# 2024: New tests -- not in Divya Kothari's original ...
422*cf5a6c84SAndroid Build Coastguard Worker
423*cf5a6c84SAndroid Build Coastguard Worker# Assigning NF=0 caused trouble
424*cf5a6c84SAndroid Build Coastguard Workertestcmd "assign NF=0" "'BEGIN { \$0 = \"a b\"; print NF, \"x\" \$0 \"y\"; NF = 0; print NF, \"x\" \$0 \"y\" }'" "2 xa by\n0 xy\n" "" ""
425*cf5a6c84SAndroid Build Coastguard Worker
426*cf5a6c84SAndroid Build Coastguard Worker# The following has never had a problem but is a good test anyway
427*cf5a6c84SAndroid Build Coastguard Workertestcmd "split on empty string" "'BEGIN { n = split(\"abc\", a, \"\");print n, length(a)}'" "3 3\n" "" ""
428*cf5a6c84SAndroid Build Coastguard Worker# The following must be run with ASAN=1 to cause failure with older versions
429*cf5a6c84SAndroid Build Coastguard Workertestcmd "split on empty regex" "'BEGIN { n = split(\"abc\", a, //);print n, length(a)}'" "3 3\n" "" ""
430*cf5a6c84SAndroid Build Coastguard Worker
431*cf5a6c84SAndroid Build Coastguard Workertestcmd "srand() seeds unix time seconds" "'{dt = srand(srand()) - \$0; ok = dt == 0 || dt == 1; print ok}'" "1\n" "" "`date +%s`"
432*cf5a6c84SAndroid Build Coastguard Workertestcmd "srand() default seed is 1" "'BEGIN{ print srand()}'" "1\n" "" ""
433*cf5a6c84SAndroid Build Coastguard Worker
434*cf5a6c84SAndroid Build Coastguard Worker# A file with empty lines can be treated as multiline records if RS="".
435*cf5a6c84SAndroid Build Coastguard WorkerFILEMULTILINE="abc defxy ghi\njkl mno\n\n\npqr stu\nvwxy abc\n"
436*cf5a6c84SAndroid Build Coastguard Worker
437*cf5a6c84SAndroid Build Coastguard Workertestcmd "multiline 1" "'BEGIN { RS=\"\"; FS=\"\"}; {print NR, NF, \$0; for (i=1;i<=NF;i++)printf \" %s %s\", i, \$i; print \"\"}'" "1 21 abc defxy ghi\njkl mno\n 1 a 2 b 3 c 4   5 d 6 e 7 f 8 x 9 y 10   11 g 12 h 13 i 14 \n 15 j 16 k 17 l 18   19 m 20 n 21 o\n2 16 pqr stu\nvwxy abc\n 1 p 2 q 3 r 4   5 s 6 t 7 u 8 \n 9 v 10 w 11 x 12 y 13   14 a 15 b 16 c\n" "" "$FILEMULTILINE"
438*cf5a6c84SAndroid Build Coastguard Workertestcmd "multiline 2" "'BEGIN { RS=\"\"; FS=\" \"}; {print NR, NF, \$0; for (i=1;i<=NF;i++)printf \" %s %s\", i, \$i; print \"\"}'" "1 5 abc defxy ghi\njkl mno\n 1 abc 2 defxy 3 ghi 4 jkl 5 mno\n2 4 pqr stu\nvwxy abc\n 1 pqr 2 stu 3 vwxy 4 abc\n" "" "$FILEMULTILINE"
439*cf5a6c84SAndroid Build Coastguard Workertestcmd "multiline 3" "'BEGIN { RS=\"\"; FS=\"x\"}; {print NR, NF, \$0; for (i=1;i<=NF;i++)printf \" %s %s\", i, \$i; print \"\"}'" "1 3 abc defxy ghi\njkl mno\n 1 abc def 2 y ghi 3 jkl mno\n2 3 pqr stu\nvwxy abc\n 1 pqr stu 2 vw 3 y abc\n" "" "$FILEMULTILINE"
440*cf5a6c84SAndroid Build Coastguard Workertestcmd "multiline 4" "'BEGIN { RS=\"\"; FS=\"[ ]\"}; {print NR, NF, \$0; for (i=1;i<=NF;i++)printf \" %s %s\", i, \$i; print \"\"}'" "1 4 abc defxy ghi\njkl mno\n 1 abc 2 defxy 3 ghi\njkl 4 mno\n2 3 pqr stu\nvwxy abc\n 1 pqr 2 stu\nvwxy 3 abc\n" "" "$FILEMULTILINE"
441*cf5a6c84SAndroid Build Coastguard Workertestcmd "multiline 5" "'BEGIN { RS=\"\"; FS=\"xy\"}; {print NR, NF, \$0; for (i=1;i<=NF;i++)printf \" %s %s\", i, \$i; print \"\"}'" "1 2 abc defxy ghi\njkl mno\n 1 abc def 2  ghi\njkl mno\n2 2 pqr stu\nvwxy abc\n 1 pqr stu\nvw 2  abc\n" "" "$FILEMULTILINE"
442*cf5a6c84SAndroid Build Coastguard Worker
443*cf5a6c84SAndroid Build Coastguard Worker# A "null" RS other than an empty string, e.g. "()" cannot match anywhere and most awks will take the entire file as one record.
444*cf5a6c84SAndroid Build Coastguard Worker# A bug in earlier versions (also in busybox awk) cause infinite output on "null RS" test
445*cf5a6c84SAndroid Build Coastguard Workertestcmd "null RS" "'BEGIN { RS=\"()\"; FS=\" \"}; {print NR, NF, \$0; for (i=1;i<=NF;i++)printf \" %s %s\", i, \$i; print \"\"}'" "1 9 abc defxy ghi\njkl mno\n\n\npqr stu\nvwxy abc\n\n 1 abc 2 defxy 3 ghi 4 jkl 5 mno 6 pqr 7 stu 8 vwxy 9 abc\n" "" "$FILEMULTILINE"
446*cf5a6c84SAndroid Build Coastguard Worker
447*cf5a6c84SAndroid Build Coastguard Workertestcmd "split() utf8"  "'BEGIN{n = split(\"aβc\", a, \"\"); printf \"%d %d\", n, length(a);for (e = 1; e <= n; e++) printf \" %s %s\", e, \"(\" a[e] \")\";print \"\"}'" "3 3 1 (a) 2 (β) 3 (c)\n" "" ""
448*cf5a6c84SAndroid Build Coastguard Workertestcmd "split fields utf8"  "'BEGIN{FS=\"\"}; {printf \"%d\", NF; for (e = 1; e <= NF; e++) printf \" %s %s\", e, \"(\" \$e \")\"; print \"\"}'" "3 1 (a) 2 (β) 3 (c)\n" "" "aβc"
449*cf5a6c84SAndroid Build Coastguard Worker
450*cf5a6c84SAndroid Build Coastguard Workertestcmd "nextfile" " '{print NR, FNR, \$0};/ghi jkl/{nextfile}/ghi,jkl/{nextfile}' testfile1.txt testfile2.txt" "1 1 abc def ghi 5\n2 2 ghi jkl mno 10\n3 1 abc,def,ghi,5\n4 2 ghi,jkl,mno,10\n" "" ""
451*cf5a6c84SAndroid Build Coastguard Worker
452*cf5a6c84SAndroid Build Coastguard Workertestcmd "getline var numeric string bug fixed 20240514"  "'BEGIN{getline var; print (var < 10.0)}'" "1\n" "" "5.0\n"
453*cf5a6c84SAndroid Build Coastguard Worker
454*cf5a6c84SAndroid Build Coastguard Workertestcmd "lshift()" "'BEGIN{print lshift(3,2)}'" "12\n" "" ""
455*cf5a6c84SAndroid Build Coastguard Workertestcmd "lshift() 64 bit" "'BEGIN{print lshift(1,40)}'" "1099511627776\n" "" ""
456*cf5a6c84SAndroid Build Coastguard Workertestcmd "rshift()" "'BEGIN{print rshift(12, 1)}'" "6\n" "" ""
457*cf5a6c84SAndroid Build Coastguard Workertestcmd "rshift() 64 bit" "'BEGIN{print rshift(1099511627776,39)}'" "2\n" "" ""
458*cf5a6c84SAndroid Build Coastguard Workertestcmd "and()" "'BEGIN{print and(16, 25)}'" "16\n" "" ""
459*cf5a6c84SAndroid Build Coastguard Workertestcmd "and(a, b, ...)" "'BEGIN{print and(16, 25, 10+16)}'" "16\n" "" ""
460*cf5a6c84SAndroid Build Coastguard Workertestcmd "or()" "'BEGIN{print or(256, 16)}'" "272\n" "" ""
461*cf5a6c84SAndroid Build Coastguard Workertestcmd "or(a, b, ...)" "'BEGIN{print or(256, 16, 8)}'" "280\n" "" ""
462*cf5a6c84SAndroid Build Coastguard Workertestcmd "toupper()" "'BEGIN{print toupper(\"abABcD\")}'" "ABABCD\n" "" ""
463*cf5a6c84SAndroid Build Coastguard Workertestcmd "tolower()" "'BEGIN{print tolower(\"abABcD\")}'" "ababcd\n" "" ""
464*cf5a6c84SAndroid Build Coastguard Workertestcmd "substr()" "'BEGIN{print substr(\"abac\", 2, 2)}'" "ba\n" "" ""
465*cf5a6c84SAndroid Build Coastguard Workertestcmd "atan2()" "'BEGIN{print substr(atan2(0, -1), 1, 5)}'" "3.141\n" "" ""
466*cf5a6c84SAndroid Build Coastguard Workertestcmd "length()" "'{print length()}'" "1\n2\n0\n4\n" "" "a\n12\n\n6502"
467*cf5a6c84SAndroid Build Coastguard Worker[ -n "$TEST_HOST" ] && export LC_ALL=en_US.UTF-8
468*cf5a6c84SAndroid Build Coastguard Workertestcmd "length() utf8" "'{print length()}'< $FILES/utf8/japan.txt" "25\n" "" ""
469*cf5a6c84SAndroid Build Coastguard Workertestcmd "substr() utf8" "'{print substr(\$0,2,1)}' < $FILES/utf8/arabic.txt" "ل\nأ\n" "" ""
470*cf5a6c84SAndroid Build Coastguard Workertestcmd "index() utf8" "'{print index(\$0, \"ス\")}' < $FILES/utf8/japan.txt"\
471*cf5a6c84SAndroid Build Coastguard Worker  "5\n" "" ""
472*cf5a6c84SAndroid Build Coastguard Workertestcmd "tolower() utf8" "'{print tolower(\$0)}'" "ğжþ\n" "" "ĞЖÞ"
473*cf5a6c84SAndroid Build Coastguard Workertestcmd "tolower() utf8 expand" "'{print tolower(\$0)}'" "ⱥⱥⱥⱥⱥⱥⱥⱥⱥⱥⱥⱥⱥⱥⱥⱥⱥⱥⱥⱥⱥⱥ\n"\
474*cf5a6c84SAndroid Build Coastguard Worker  "" "ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ\n"
475*cf5a6c84SAndroid Build Coastguard Workertestcmd "index() none" "'BEGIN{print index(\"ス\", \"deadbeef\")}'" "0\n" "" ""
476*cf5a6c84SAndroid Build Coastguard Workertestcmd "index() same" "'BEGIN{print index(\"deadbeef\", \"deadbeef\")}'" "1\n" "" ""
477*cf5a6c84SAndroid Build Coastguard Workertestcmd "match()" "'BEGIN{print match(\"bcdab\", \"ab\")}'" "4\n" "" ""
478*cf5a6c84SAndroid Build Coastguard Workertestcmd "match() none" "'BEGIN{print match(\"ス\", \"deadbeef\")}'" "0\n" "" ""
479*cf5a6c84SAndroid Build Coastguard Workertestcmd "match() utf8" "'{print match(\$0, \"ス\")}' < $FILES/utf8/japan.txt"\
480*cf5a6c84SAndroid Build Coastguard Worker  "5\n" "" ""
481*cf5a6c84SAndroid Build Coastguard Workertestcmd "\\u" "'BEGIN{print \"\\u20\u255\"}' < /dev/null" " ɕ\n" "" ""
482*cf5a6c84SAndroid Build Coastguard Workertestcmd "printf %c" "'BEGIN{a=255; printf \"%c%c%c\", a, b, 255}'"\
483*cf5a6c84SAndroid Build Coastguard Worker  "ÿ\0ÿ" "" ""
484*cf5a6c84SAndroid Build Coastguard Worker
485*cf5a6c84SAndroid Build Coastguard Workertestcmd "printf %c, 0" "'BEGIN{a=0; printf \"(%c)\", a}'" "(\000)" "" ""
486*cf5a6c84SAndroid Build Coastguard Workertestcmd "printf %c, null_string" "'BEGIN{a=\"\"; printf \"(%c)\", a}'" "(\000)" "" ""
487*cf5a6c84SAndroid Build Coastguard Workertestcmd "printf %c, utf8" "'BEGIN{a=\"ú\"; printf \"(%c)\", a}'" "(ú)" "" ""
488*cf5a6c84SAndroid Build Coastguard Worker#testcmd "name" "command" "result" "infile" "stdin"
489*cf5a6c84SAndroid Build Coastguard Worker
490*cf5a6c84SAndroid Build Coastguard Workertestcmd "-b" "-b '{print length()}'< $FILES/utf8/japan.txt" "75\n" "" ""
491*cf5a6c84SAndroid Build Coastguard Worker
492*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -e print print ARGC file1 file2" "'{ print \$1; print ARGC }' testfile1.txt testfile2.txt" "abc\n3\nghi\n3\nmno\n3\nstu\n3\n\n3\nabc,def,ghi,5\n3\nghi,jkl,mno,10\n3\nmno,pqr,stu,15\n3\nstu,vwx,abc,20\n3\n\n3\n" "" ""
493*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -e print ARGC file" "'{ print ARGC }' testfile1.txt" "2\n2\n2\n2\n2\n" "$FILE1" ""
494*cf5a6c84SAndroid Build Coastguard Workertestcmd "awk -e print print ARGC input" "'{ print \$1; print ARGC }' input" "abc\n2\nghi\n2\nmno\n2\nstu\n2\n" "$FILE1" ""
495*cf5a6c84SAndroid Build Coastguard Worker
496*cf5a6c84SAndroid Build Coastguard Workerrm test.awk testfile1.txt testfile2.txt
497