Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/sort/testsort.sh
1808 views
1
########################################################################
2
# #
3
# This software is part of the ast package #
4
# Copyright (c) 1996-2011 AT&T Intellectual Property #
5
# and is licensed under the #
6
# Eclipse Public License, Version 1.0 #
7
# by AT&T Intellectual Property #
8
# #
9
# A copy of the License is available at #
10
# http://www.eclipse.org/org/documents/epl-v10.html #
11
# (with md5 checksum b35adb5213ca9657e911e9befb180842) #
12
# #
13
# Information and Software Systems Research #
14
# AT&T Research #
15
# Florham Park NJ #
16
# #
17
# Glenn Fowler <[email protected]> #
18
# Phong Vo <[email protected]> #
19
# Doug McIlroy <[email protected]> #
20
# #
21
########################################################################
22
: sorttest [ sort test-options ... ]
23
# Tests for the Unix sort utility
24
# Test Posix features except for locale.
25
# Test some nonstandard features if present.
26
27
AWK=awk
28
CC=${CC:-${TESTCC:-cc}}
29
LC_ALL=C
30
NAWK=nawk
31
SUM=sum
32
SORT=sort
33
TMP=sort.tmp
34
35
export TEST AWK CC LC_ALL SUM SORT TMP
36
37
case $# in
38
0) set $SORT ;;
39
esac
40
41
# Some intermediate file tests require ~100 fds,
42
# and some systems have low ~64 fds defaults.
43
(ulimit -n 128) >/dev/null 2>&1 && ulimit -n 128
44
45
# Other tests may be needed for files too big to fit in memory;
46
# see TEST=15 below
47
48
SORT=$1
49
shift
50
SORT_ARGS="$@"
51
path=`pwd`:$PATH:/usr/5bin:/bin:/usr/bin
52
ifs=${IFS-'
53
'}
54
IFS=":"
55
set $path
56
IFS=$ifs
57
for dir
58
do case $dir in
59
"") continue ;;
60
esac
61
case $NAWK in
62
*/*) ;;
63
*) if test -x $dir/$NAWK
64
then NAWK=$dir/$NAWK
65
else case $AWK in
66
*/*) ;;
67
*) test -x $dir/$AWK && AWK=$dir/$AWK ;;
68
esac
69
fi
70
;;
71
esac
72
case $SORT in
73
*/*) ;;
74
*) test -x $dir/$SORT && SORT=$dir/$SORT ;;
75
esac
76
case $SUM in
77
*/*) ;;
78
*) if test -x $dir/$SUM
79
then AB='abc
80
pdq
81
xyz'
82
BA='xyz
83
pdq
84
abc'
85
ab=`echo "$AB" | $SUM 2>/dev/null`
86
ba=`echo "$BA" | $SUM 2>/dev/null`
87
case $ab in
88
$ba) SUM=$dir/$SUM
89
;;
90
*) for old in -o '-o 2' -s -xatt
91
do ab=`echo "$AB" | $dir/$SUM $old 2>/dev/null`
92
case $ab in
93
?*) ba=`echo "$BA" | $dir/$SUM $old 2>/dev/null`
94
case $ab in
95
$ba) SUM="$dir/$SUM $old"
96
break
97
;;
98
esac
99
;;
100
esac
101
done
102
;;
103
esac
104
fi
105
;;
106
esac
107
done
108
case $NAWK in
109
*/*) AWK=$NAWK ;;
110
esac
111
echo pathname and options of item under test
112
echo " $SORT $SORT_ARGS"
113
echo
114
SORT="$SORT $SORT_ARGS"
115
116
# All work done in local temp dir.
117
118
trap "cd ..; rm -rf $TMP; exit" 0 1 2 13 15
119
rm -rf $TMP
120
if mkdir $TMP
121
then cd $TMP
122
else echo "mkdir $TMP FAILED"
123
exit 1
124
fi
125
126
# Initialize switches for nonstandard features.
127
# Use parenthesized settings for supported features.
128
129
o=: # officially obsolescent features: +1 -2
130
O=: # really obsolescent features: displaced -o (o=)
131
g=: # -g numeric sort including e-format numbers (g=)
132
k=: # -Rr -k.p.l fixed records and fields
133
M=: # -M sort by month names (M=)
134
s=: # -s stable, do not compare raw bytes on equal keys (s=)
135
S=: # -S unstable, compare raw bytes on equal keys (S=)
136
x=: # -x method, alternate sort method (x=)
137
X=: # -Xtest, -Xread ensures read over memory map
138
y= # -y user-specified memory size (y=-y4096)
139
140
# Detect what features are supported, assuming bad options cause
141
# errors. Set switches accordingly.
142
143
echo obsolescent and nonstandard features recognized, if any
144
if $SORT +0 </dev/null 2>/dev/null; then o=
145
echo ' +1 -2'; fi
146
if $SORT /dev/null -o xx 2>/dev/null; then O=
147
echo ' displaced -o'; fi
148
if $SORT -g </dev/null 2>/dev/null; then g=
149
echo ' -g g-format numbers'; fi
150
if test Xcx.by.az = X`echo by.cx.az | $SORT -R3 -k.2.1 2>/dev/null`; then k=
151
echo ' -Rr -k.p:l fixed length records'; fi
152
if $SORT -M </dev/null 2>/dev/null; then M=
153
echo ' -M months'; fi
154
if $SORT -s </dev/null 2>/dev/null; then s=
155
echo ' -s stable'; fi
156
if $SORT -S </dev/null 2>/dev/null; then S=
157
echo ' -S unstable'; fi
158
if $SORT -x default </dev/null 2>/dev/null; then x=
159
echo ' -x method'; fi
160
if test Xok = X`$SORT -Xtest 2>/dev/null`; then X=
161
echo ' -Xread ensures read instead of memory map'; fi
162
if $SORT -y4096 </dev/null 2>/dev/null; then y=-y4096
163
echo ' -y space'; fi
164
if $SORT -z10000 </dev/null 2>/dev/null; then
165
echo ' -z recsize (not exercised)'; fi
166
if $SORT -T. </dev/null 2>/dev/null; then
167
echo ' -T tempdir (not exercised)'; fi
168
169
# xsort testno options
170
# Sort file "in" with specified options.
171
# Compare with file "out" if that is supplied,
172
# otherwise make plausibility checks on output
173
174
cat >xsort <<!
175
176
case \$1 in
177
-) F=-; shift ;;
178
*) F=in ;;
179
esac
180
X=\$1; shift
181
182
if \$SORT "\$@" \$F >xx && \$SORT -c "\$@" xx 2>/dev/null
183
then
184
if test -f out
185
then
186
cmp -s xx out >/dev/null && exit 0
187
echo \$TEST\$X comparison FAILED
188
else
189
test "\`$SUM <in\`" = "\`$SUM <xx\`" && exit 0
190
echo \$TEST\$X checksum FAILED
191
fi
192
else
193
echo \$TEST\$X FAILED
194
fi
195
exit 1
196
!
197
chmod +x xsort
198
199
# ysort options
200
# called to check diagnostics
201
202
cat <<! >ysort
203
error=0 warning=0 works=0
204
$SORT "\$@" 2>out <in >in1 || error=1
205
test -s out && warning=1
206
test -s in1 && works=1
207
case \$error\$warning\$works in
208
000) echo " \$@" does not indicate trouble, but does not sort ;;
209
001) echo " \$@" does not indicate trouble ;;
210
010) echo " \$@" warns, does not sort, and yields exit status zero ;;
211
011) echo " \$@" warns and continues ;;
212
100) echo " \$@" yields nonzero exit status and does not sort ;;
213
101) echo " \$@" yields nonzero exit status, but sorts ;;
214
111) echo " \$@" warns and yields nonzero exit status, but sorts
215
esac
216
!
217
chmod +x ysort
218
219
# linecount testno file count
220
# declares the given "testno" to be in error if number of
221
# lines in "file" differs from "count"
222
223
cat >linecount <<'!'
224
$AWK 'END{ if(NR!='$3') print "'$TEST$1' FAILED" }' $2
225
!
226
chmod +x linecount
227
228
# instability by default for the standard
229
230
case $S in
231
'') SORT="$SORT -S" ;;
232
esac
233
234
# check behavior in questionable cases
235
236
echo
237
echo "behavior in questionable cases (other than message and exit)"
238
echo hi >in
239
240
rm -f nosuchfile
241
./ysort nosuchfile
242
243
if test ! -f unwritablefile
244
then echo x >unwritablefile
245
chmod 0 unwritablefile
246
fi
247
./ysort -o unwritablefile </dev/null
248
249
cat in | ./ysort - -
250
251
./ysort -- in
252
253
for i in -k -k0 -k-1 -k1, -kb -k1,2u -t -o
254
do ./ysort $i
255
done
256
257
$g ./ysort -n -g
258
$M ./ysort -n -M
259
./ysort -d -i
260
./ysort -n -i
261
./ysort -c in in
262
./ysort -t. -t:
263
264
for i in -a -e -h -j -p -q -v -w -x -0 -1 -2
265
do ./ysort $i
266
done
267
268
$g false && ./ysort -g
269
$s false && ./ysort -s
270
$z false && ./ysort -z
271
272
case "$y" in
273
"") ./ysort -y
274
esac
275
276
./ysort -k1,1 -f
277
278
cat >in <<!
279
A b
280
a bc
281
a Bd
282
B
283
!
284
cat >in1 <<!
285
A b
286
B
287
a bc
288
a Bd
289
!
290
cat >in2 <<!
291
A b
292
B
293
a Bd
294
a bc
295
!
296
297
if $SORT -k1,1 -f -k2,2 <in >out 2>/dev/null
298
then
299
opt="-k1,1 -f -k2,2 :"
300
if cmp -s out in >/dev/null
301
then echo " $opt -f applies to fields 1 and 2"
302
elif cmp -s out in1 >/dev/null
303
then echo " $opt -f applies to field 2 only"
304
elif cmp -s out in1 >/dev/null
305
then echo " $opt -f ineffectual"
306
elif cmp -s out /dev/null >/dev/null
307
then echo " $opt exit status zero, but no output"
308
else echo " $opt inexplicable"
309
fi
310
fi
311
312
# generate large data here to smooth the test feedback
313
314
echo
315
echo "generating large data files for tests that follow (long)"
316
$AWK 'BEGIN { for(i=0; i<100000; i++) print rand() }' </dev/null |
317
grep -v e >14.in
318
$AWK 'BEGIN {
319
x = "xxxxxxxxxx"
320
x = x x x x x x x x
321
for(i=0; i<8000; i++) print rand(), x }' >15.in </dev/null
322
rm -f in out
323
324
echo
325
echo test numbers denote progress, not trouble
326
327
# check for and loop on alternate methods
328
329
case $x in
330
'') set `$SORT --list < /dev/null | sed 's/[ ].*//'` ;;
331
*) set '' ;;
332
esac
333
334
COMMAND=$SORT
335
while :
336
do case $# in
337
0) break ;;
338
esac
339
METHOD=$1
340
shift
341
case $METHOD in
342
check|copy|verify)
343
continue
344
;;
345
'') echo
346
;;
347
*) SORT="$COMMAND -x $METHOD"
348
echo
349
echo "testing the $METHOD method"
350
echo
351
;;
352
esac
353
354
#---------------------------------------------------------------
355
TEST=01; echo $TEST "-c status, checksum"
356
# obsolescent features go together
357
cat >in <<!
358
b
359
a
360
!
361
rm -f out -o
362
363
$SORT -c in 2>/dev/null && echo ${TEST}A FAILED
364
365
./xsort B || echo ${TEST}B $SUM is probably unsuitable - see comments
366
367
$o $SORT -o in +0 in || echo ${TEST}C FAILED
368
369
#---------------------------------------------------------------
370
TEST=02; echo $TEST "output from -c"
371
cat >in <<!
372
x
373
y
374
!
375
376
$SORT -cr in >out 2>xx && echo ${TEST}A FAILED
377
test -s out && echo ${TEST}B FAILED
378
test -s xx || echo option -c is quiet "(legal, not classical)"
379
380
$SORT -c /dev/null 2>xx || echo ${TEST}C FAILED
381
test -s xx && echo ${TEST}D FAILED
382
383
#---------------------------------------------------------------
384
TEST=03; echo $TEST "-n"
385
cat >in <<!
386
-99.0
387
-99.1
388
-.0002
389
-10
390
2
391
2.0x
392
2.0.1
393
0010.000000000000000000000000000000000001
394
10
395
3x
396
x
397
!
398
cat >out <<!
399
-99.1
400
-99.0
401
-10
402
-.0002
403
x
404
2
405
2.0.1
406
2.0x
407
3x
408
10
409
0010.000000000000000000000000000000000001
410
!
411
412
./xsort "" -n
413
414
#---------------------------------------------------------------
415
TEST=04; echo $TEST "-b without fields, piping, -c status return"
416
cat >in <<!
417
b
418
a
419
!
420
cp in out
421
422
./xsort A -b
423
424
cat in | $SORT | cat >xx
425
cmp -s xx out >/dev/null || echo ${TEST}B FAILED
426
427
$SORT in | $SORT -cr 2>/dev/null && echo ${TEST}C FAILED
428
429
#---------------------------------------------------------------
430
TEST=05; echo $TEST "fields, reverse fields, -c status return"
431
cat >in <<!
432
b b p
433
a b q
434
x a
435
!
436
cat >out <<!
437
x a
438
a b q
439
b b p
440
!
441
442
$o ./xsort A +1 -2
443
444
$o ./xsort B +1 -2 +2r
445
446
./xsort C -k 2,2
447
448
./xsort D -k 2,2 -k 3r
449
450
./xsort E -k 2,2.0
451
452
./xsort F -k 2,2 -k 1,1 -k 3
453
454
$SORT -c -k 2 in 2>/dev/null && ${TEST}G FAILED
455
456
#---------------------------------------------------------------
457
TEST=06; echo $TEST "-t"
458
cat >in <<!
459
a:
460
a!
461
!
462
cp in out
463
464
$o ./xsort A -t : -r +0
465
466
$o ./xsort B -t : +0 -1
467
468
./xsort C -t : -r -k 1
469
470
./xsort D -t : -k 1,1
471
472
#---------------------------------------------------------------
473
TEST=07; echo $TEST "-t, character positions in fields"
474
# -t: as 1 arg is not strictly conforming, but classical
475
cat >in <<!
476
: ab
477
:bac
478
!
479
cat >out <<!
480
:bac
481
: ab
482
!
483
484
$o ./xsort A -b -t: +1.1
485
486
$o ./xsort B -t: +1.1r
487
488
./xsort C -b -t: -k 2.2
489
490
./xsort D -t: -k 2.2r
491
492
#---------------------------------------------------------------
493
TEST=08; echo $TEST "space and tab as -t characters"
494
cat >in <<!
495
b c
496
b c
497
b c
498
!
499
cp in out
500
501
./xsort A -t ' ' -k2,2
502
503
./xsort B -t ' ' -k2.1,2.0
504
505
cat >out <<!
506
b c
507
b c
508
b c
509
!
510
511
./xsort C -t ' ' -k2,2
512
513
./xsort D -t ' ' -k2.1,2.0
514
515
cat >out <<!
516
b c
517
b c
518
b c
519
!
520
521
./xsort E -k2
522
523
cat >out <<!
524
b c
525
b c
526
b c
527
!
528
529
./xsort F -k2b
530
531
#---------------------------------------------------------------
532
TEST=09; echo $TEST "alphabetic as -t character"
533
cat >in <<!
534
zXa
535
yXa
536
zXb
537
!
538
cp in out
539
540
./xsort "" -tX -k2 -k1r,1
541
542
#---------------------------------------------------------------
543
TEST=10; echo $TEST "-m"
544
cat >in <<!
545
a
546
ab
547
ab
548
bc
549
ca
550
!
551
cat >in1 <<!
552
Z
553
a
554
aa
555
ac
556
c
557
!
558
cat >out <<!
559
Z
560
a
561
a
562
aa
563
ab
564
ab
565
ac
566
bc
567
c
568
ca
569
!
570
571
$SORT -m in in1 >xx
572
cmp -s xx out >/dev/null || echo ${TEST}A FAILED
573
574
#---------------------------------------------------------------
575
TEST=11; echo $TEST "multiple files, -o overwites input, -m, -mu"
576
cat >in <<!
577
a
578
b
579
c
580
d
581
!
582
583
$SORT -o xx in in in in in in in in in in in in in in in in in
584
./linecount A xx 68
585
$SORT -o in -mu in in in in in in in in in in in in in in in in in
586
./linecount B in 4
587
$SORT -o in -m in in in in in in in in in in in in in in in in in
588
589
cmp -s in xx >/dev/null || echo ${TEST}C FAILED
590
591
#---------------------------------------------------------------
592
TEST=12; echo $TEST "does -mu pick the first among equals?"
593
cat >in <<!
594
3B
595
3b
596
3B2
597
~3B2
598
4.1
599
41
600
5
601
5.
602
!
603
cat >out <<!
604
3B
605
3B2
606
4.1
607
5
608
!
609
610
./xsort A -mudf || echo "(other behavior is legal, not classical)"
611
612
./xsort B -mudf -k1 || echo "(other behavior is legal, not classical)"
613
614
#---------------------------------------------------------------
615
TEST=13; echo $TEST "long records (>8000 bytes, keys >16000), -r"
616
$AWK '
617
BEGIN { x="x"
618
for(i=1; i<=12; i++) x = x x
619
for(i=15; i<=25; i++) print x i
620
}' >in </dev/null
621
$AWK '
622
BEGIN { x="x"
623
for(i=1; i<=12; i++) x = x x
624
for(i=25; i>=15; i--) print x i
625
}' >out </dev/null
626
627
./xsort A -r
628
629
./xsort B -k 1,1r -k 1
630
631
#---------------------------------------------------------------
632
TEST=14; echo $TEST "-n and -u"
633
cp 14.in in
634
rm -f out
635
636
./xsort A
637
638
./xsort B -n
639
640
# next test is unclean: xx is a hidden side-effect of xsort
641
642
$AWK '
643
$0 < x { print "test '${TEST}C' FAILED"; exit }
644
"X" $0 != "X" x { print >"out"; x = $0 }
645
' xx
646
647
./xsort C -n -u
648
649
#---------------------------------------------------------------
650
TEST=15; echo $TEST "force intermediate files if possible"
651
# option -y4096 ($y) should force a multi-stage internal merge
652
# option -Xread ($X) should force read over mmap
653
case "$y" in
654
"") echo ${TEST} inadequate test of large files - revise parameters
655
esac
656
657
cp 15.in in
658
rm -f out
659
660
./xsort A -r $y
661
cat in | ./xsort - B -r $y
662
$X ./xsort C -r $y -Xread
663
$X cat in | $X ./xsort - D -r $y -Xread
664
665
rm -f in1
666
$SORT -r -o in1 in
667
$AWK '$0 "x" != x { print ; x = $0 "x" }' in1 >out
668
669
./xsort E -u -r $y
670
cat in | ./xsort - F -u -r $y
671
$X ./xsort G -u -r $y -Xread
672
$X cat in | $X ./xsort - H -u -r $y -Xread
673
674
$SORT -r -u -m -o in1 in1
675
cmp -s in1 out >/dev/null || echo ${TEST}I FAILED
676
rm in in1 out
677
678
#---------------------------------------------------------------
679
TEST=16; echo $TEST "-nr, -nm, file name -"
680
$AWK 'BEGIN { for(i=-100; i<=100; i+=2) printf "%.10d\n", i }' >in </dev/null
681
682
$AWK 'BEGIN { for(i=-99; i<=100; i+=2) print i }' </dev/null |
683
$SORT -nr in - >xx
684
$AWK '$0+0 != 101-NR { print "'${TEST}A' FAILED"; exit }' xx
685
686
$AWK 'BEGIN { for(i=-99; i<=100; i+=2) print i }' </dev/null |
687
$SORT -mn - in >xx
688
$AWK '$0+0 != -101+NR { print "'${TEST}B' FAILED"; exit }' xx
689
690
#---------------------------------------------------------------
691
TEST=17; echo $TEST "-d, fields without end, modifier override"
692
cat >in <<!
693
a-B
694
a+b
695
a b
696
A+b
697
a b
698
!
699
cat >out <<!
700
a b
701
a b
702
A+b
703
a-B
704
a+b
705
!
706
707
$o ./xsort A -df +0 +0d
708
709
./xsort B -df -k 1 -k 1d
710
711
#---------------------------------------------------------------
712
TEST=18; echo $TEST "-u on key only"
713
cat >in <<!
714
12 y
715
13 z
716
12 x
717
!
718
cat >out <<!
719
12 x
720
12 y
721
13 z
722
!
723
724
$o ./xsort A +0 -1
725
726
./xsort B -k 1,1
727
728
$SORT -u -k 1,1 in >xx
729
./linecount C xx 2
730
731
#---------------------------------------------------------------
732
TEST=19; echo $TEST "-i, -d, -f"
733
cat >xx.c <<!
734
#include <stdio.h>
735
static void run(int i, int j){ for( ; i<=j; i++) printf("%.3o %c\n",i,i); }
736
int main(){ run(0, 011); /* 012=='\n' */
737
run(013, 0377);
738
return 0; }
739
!
740
$CC -o xx.exe xx.c
741
./xx.exe >in
742
cat >xx.c <<!
743
#include <stdio.h>
744
static void run(int i, int j){ for( ; i<=j; i++) printf("%.3o %c\n",i,i); }
745
int main(){ run(0, 011);
746
run(013, ' '-1);
747
run(0177, 0377);
748
run(' ', 0176);
749
return 0; }
750
!
751
$CC -o xx.exe xx.c
752
./xx.exe >out
753
754
./xsort A -i -k 2
755
756
cat >xx.c <<!
757
#include <stdio.h>
758
static void run(int i, int j){ for( ; i<=j; i++) printf("%.3o %c\n",i,i); }
759
int main(){ run(0, 010); /* 011=='\t', 012=='\n' */
760
run(013, ' '-1);
761
run(' '+1, '0'-1);
762
run('9'+1, 'A'-1);
763
run('Z'+1, 'a'-1);
764
run('z'+1, 0377);
765
run('\t', '\t');
766
run(' ', ' ');
767
run('0', '9');
768
run('A', 'Z');
769
run('a', 'z');
770
return 0; }
771
!
772
$CC -o xx.exe xx.c
773
./xx.exe >out
774
775
./xsort B -d -k 2
776
777
cat >xx.c <<!
778
#include <stdio.h>
779
static void run(int i, int j){ for( ; i<=j; i++) printf("%.3o %c\n",i,i); }
780
int main(){ int i;
781
run(0, 011);
782
run(013, 'A'-1);
783
for(i='A'; i<='Z'; i++)
784
printf("%.3o %c\n%.3o %c\n",i,i,i+040,i+040);
785
run('Z'+1, 'a'-1);
786
run('z'+1, 0377);
787
return 0; }
788
!
789
$CC -o xx.exe xx.c
790
./xx.exe >out
791
rm -f xx.c xx.o xx.exe
792
793
./xsort C -f -k 2
794
795
#---------------------------------------------------------------
796
TEST=20; echo $TEST "-d, -f, -b applies only to fields"
797
cat >in <<!
798
b
799
'C
800
a
801
!
802
cp in out
803
804
./xsort A -d
805
806
./xsort B -f
807
808
cat >out <<!
809
b
810
a
811
'C
812
!
813
814
./xsort C -dfb
815
816
#---------------------------------------------------------------
817
TEST=21; echo $TEST "behavior of null bytes"
818
cat >xx.c <<'!'
819
#include <stdio.h>
820
int main() { printf("\n%cb\n%ca\n",0,0); return 0; }
821
!
822
$CC -o xx.exe xx.c
823
./xx.exe >in
824
$SORT -u in >xx
825
cmp -s in xx >/dev/null && echo ${TEST}A FAILED
826
test "`wc -c <in`" = "`wc -c <xx`" || echo ${TEST}B FAILED
827
rm -f xx.c xx.o xx.exe
828
829
#---------------------------------------------------------------
830
TEST=22; echo $TEST "field limits"
831
cat >in <<!
832
a 2
833
a 1
834
b 2
835
b 1
836
!
837
cat >out <<!
838
b 1
839
b 2
840
a 1
841
a 2
842
!
843
844
./xsort "" -r -k1,1 -k2n
845
846
#---------------------------------------------------------------
847
TEST=23; echo $TEST "empty file, compact -o"
848
849
echo hi >xx
850
851
$SORT -oxx </dev/null
852
cmp -s xx /dev/null >/dev/null || echo ${TEST}A FAILED
853
854
$SORT -c </dev/null || echo ${TEST}B FAILED
855
856
$SORT -cu </dev/null || echo ${TEST}C FAILED
857
858
#---------------------------------------------------------------
859
TEST=24; echo $TEST "many fields"
860
cat >in <<!
861
0:2:3:4:5:6:7:8:9
862
1:1:3:4:5:6:7:8:9
863
1:2:2:4:5:6:7:8:9
864
1:2:3:3:5:6:7:8:9
865
1:2:3:4:4:6:7:8:9
866
1:2:3:4:5:5:7:8:9
867
1:2:3:4:5:6:6:8:9
868
1:2:3:4:5:6:7:7:9
869
1:2:3:4:5:6:7:8:8
870
!
871
cat >out <<!
872
1:2:3:4:5:6:7:8:8
873
1:2:3:4:5:6:7:7:9
874
1:2:3:4:5:6:6:8:9
875
1:2:3:4:5:5:7:8:9
876
1:2:3:4:4:6:7:8:9
877
1:2:3:3:5:6:7:8:9
878
1:2:2:4:5:6:7:8:9
879
1:1:3:4:5:6:7:8:9
880
0:2:3:4:5:6:7:8:9
881
!
882
883
./xsort "" -t: -k9 -k8 -k7 -k6 -k5 -k4 -k3 -k2 -k1
884
885
#---------------------------------------------------------------
886
TEST=25; echo $TEST "variously specified alpha fields"
887
# numbers give the correct orderings
888
cat >in <<!
889
01:04:19:01:16:01:21:01 a
890
02:03:13:15:13:19:15:02 a
891
03:02:07:09:07:13:09:03 a
892
04:01:01:03:01:07:03:04 a
893
05:08:20:16:17:02:20:05 aa
894
06:07:14:18:14:20:14:06 aa
895
07:06:08:10:08:14:08:07 aa
896
08:05:02:04:02:08:02:08 aa
897
09:16:22:02:22:04:24:13 b
898
10:15:16:20:19:22:18:14 b
899
11:14:10:12:10:16:12:15 b
900
12:13:04:06:04:10:06:16 b
901
13:24:24:22:24:06:22:21 bb
902
14:23:18:24:21:24:16:22 bb
903
15:22:12:14:12:18:10:23 bb
904
16:21:06:08:06:12:04:24 bb
905
17:12:21:21:18:03:19:09 ab
906
18:11:15:19:15:21:13:10 ab
907
19:10:09:11:09:15:07:11 ab
908
20:09:03:05:03:09:01:12 ab
909
21:20:23:17:23:05:23:17 ba
910
22:19:17:23:20:23:17:18 ba
911
23:18:11:13:11:17:11:19 ba
912
24:17:05:07:05:11:05:20 ba
913
!
914
$SORT -k2b -k2 in >xx
915
$SORT -c -t: -k2n xx 2>/dev/null || echo ${TEST}A FAILED
916
$SORT -k2,2.1b -k2 in >xx
917
$SORT -c -t: -k3n xx 2>/dev/null || echo ${TEST}B FAILED
918
$SORT -k2.3 -k2 in >xx
919
$SORT -c -t: -k4n xx 2>/dev/null || echo ${TEST}C FAILED
920
$SORT -k2b,2.3 -k2 in >xx
921
$SORT -c -t: -k5n xx 2>/dev/null || echo ${TEST}D FAILED
922
$SORT -k2.3,2.1b -k2 in >xx
923
$SORT -c -t: -k6n xx 2>/dev/null || echo ${TEST}E FAILED
924
$SORT -k2,2.1b -k2r in >xx
925
$SORT -c -t: -k7n xx 2>/dev/null || echo ${TEST}F FAILED
926
$SORT -b -k2,2 -k2 in >xx
927
$SORT -c -t: -k8n xx 2>/dev/null || echo ${TEST}G FAILED
928
$SORT -b -k2,2b -k2 in >xx # perhaps same as G
929
$SORT -c -t: -k3n xx 2>/dev/null || echo ${TEST}H FAILED\
930
"(standard is not clear on this)"
931
932
#---------------------------------------------------------------
933
TEST=26; echo $TEST "empty fields, out of bounds fields "
934
cat >in <<!
935
0 5
936
1 4
937
2 3
938
3 2
939
4 1
940
5 0
941
!
942
cp in out
943
944
./xsort "" -k2.2,2.1 -k2.3,2.4
945
946
#---------------------------------------------------------------
947
TEST=27; echo $TEST "displaced -o"
948
rm -f out
949
950
$O $SORT /dev/null -o out || $o echo ${TEST}B FAILED
951
$O test -f out || $O echo ${TEST}C FAILED
952
953
#---------------------------------------------------------------
954
TEST=28; echo $TEST "apparently nonmonotone field specs"
955
cat >in <<!
956
aaaa c
957
x a
958
0 b
959
!
960
cp in out
961
962
$o ./xsort A +1 -0.3 +1.4 -1.5
963
964
./xsort B -k2,1.3 -k2.5,2.5
965
966
#---------------------------------------------------------------
967
TEST=29; echo $TEST "determination of end of option list"
968
cat >-k <<!
969
x
970
!
971
rm -f out -c
972
973
$SORT -- -k </dev/null >xx || echo ${TEST}A argument FAILED
974
cmp -s xx -k || echo ${TEST}A comparison FAILED
975
976
cat >in <<!
977
xxx
978
!
979
>-
980
>-o
981
>in1
982
983
$SORT -- -o in1 - <in >out
984
cmp -s in out >/dev/null || echo ${TEST}C FAILED
985
test -s in1 && echo ${TEST}D FAILED
986
987
#---------------------------------------------------------------
988
TEST=30; echo $TEST "missing newline"
989
$AWK 'BEGIN{ printf "%s", "x"}' >in
990
echo x >out
991
992
./xsort "" 2>/dev/null
993
994
#---------------------------------------------------------------
995
TEST=31; echo $TEST "-M, multiple fields"
996
cat >in <<!
997
jan 10 1900
998
Feb 26 1900
999
feb 25 1900
1000
January xx 1900
1001
August 11 1900
1002
jan 15 1990
1003
feb 22 1990
1004
mar 15 1990
1005
apr 1 1990
1006
may 45 1990
1007
jun 14 1990
1008
jul 4 1990
1009
aug 1~ 1990
1010
aug 11 1990
1011
sep 1 1990
1012
oct 12 1990
1013
nov 24 1990
1014
dec 25 1990
1015
never 3 1990
1016
Dec 25 1990
1017
!
1018
cat >out <<!
1019
January xx 1900
1020
jan 10 1900
1021
feb 25 1900
1022
Feb 26 1900
1023
August 11 1900
1024
never 3 1990
1025
jan 15 1990
1026
feb 22 1990
1027
mar 15 1990
1028
apr 1 1990
1029
may 45 1990
1030
jun 14 1990
1031
jul 4 1990
1032
aug 1~ 1990
1033
aug 11 1990
1034
sep 1 1990
1035
oct 12 1990
1036
nov 24 1990
1037
Dec 25 1990
1038
dec 25 1990
1039
!
1040
1041
$M ./xsort "" -k3n -k1M -k2n
1042
1043
#---------------------------------------------------------------
1044
TEST=32; echo $TEST "-M case insensitivity, -r"
1045
cat >in <<!
1046
x
1047
june
1048
january
1049
december
1050
!
1051
cat >out <<!
1052
december
1053
june
1054
january
1055
x
1056
!
1057
1058
$M ./xsort "" -Mr
1059
1060
#---------------------------------------------------------------
1061
TEST=33; echo $TEST "-g, big enough for IEEE floating point"
1062
cat >in <<!
1063
2
1064
1
1065
10
1066
1e-1
1067
.2
1068
1e
1069
1E1
1070
1e.
1071
3e+308
1072
3e307
1073
1e-308
1074
1e-307
1075
!
1076
cat >out <<!
1077
1e-308
1078
1e-307
1079
1e-1
1080
.2
1081
1
1082
1e
1083
1e.
1084
2
1085
10
1086
1E1
1087
3e307
1088
3e+308
1089
!
1090
1091
$g ./xsort "" -g
1092
1093
#---------------------------------------------------------------
1094
TEST=34; echo $TEST "-g wide operands"
1095
cat >in <<!
1096
.99999999999999999999
1097
099999999999999999999e-21
1098
099999999999999999999e-19
1099
.1e1
1100
!
1101
cat >out <<!
1102
099999999999999999999e-21
1103
.99999999999999999999
1104
.1e1
1105
099999999999999999999e-19
1106
!
1107
1108
$g ./xsort A -g
1109
1110
cat >out <<!
1111
.1e1
1112
.99999999999999999999
1113
099999999999999999999e-19
1114
099999999999999999999e-21
1115
!
1116
1117
./xsort B -n
1118
1119
#---------------------------------------------------------------
1120
TEST=35; echo $TEST "-g, -u with different fp reps"
1121
cat >in <<!
1122
+0
1123
-0
1124
0
1125
0.10
1126
+.1
1127
-.1
1128
-100e-3x
1129
x
1130
!
1131
cat >out <<!
1132
-.1
1133
-100e-3x
1134
+0
1135
-0
1136
0
1137
x
1138
+.1
1139
0.10
1140
!
1141
1142
$g ./xsort A -g
1143
1144
$g $SORT -gu in >xx && $g $SORT -c -gu xx || echo ${TEST}B FAILED
1145
$g ./linecount C xx 3
1146
1147
#---------------------------------------------------------------
1148
TEST=36; echo $TEST "-s"
1149
cat >in <<!
1150
a 2
1151
b 1
1152
c 2
1153
a 1
1154
b 2
1155
c 1
1156
!
1157
cat >out <<!
1158
a 2
1159
a 1
1160
b 1
1161
b 2
1162
c 2
1163
c 1
1164
!
1165
1166
$s ./xsort "" -s -k1,1
1167
1168
#---------------------------------------------------------------
1169
TEST=37; echo $TEST "-s, multiple files"
1170
cat >in <<!
1171
a 2
1172
c 2
1173
!
1174
cat >in1 <<!
1175
a 1
1176
b 1
1177
c 1
1178
!
1179
1180
cat >out <<!
1181
a 2
1182
b 1
1183
c 2
1184
!
1185
1186
$s $SORT -su -k1,1 in in in1 in1 >xx
1187
$s cmp -s xx out >/dev/null || echo ${TEST}A FAILED
1188
1189
cat >out <<!
1190
c 1
1191
b 1
1192
a 1
1193
!
1194
1195
$s $SORT -sru -k1,1 in in in1 in1 >xx
1196
$s cmp -s xx out >/dev/null || echo ${TEST}B FAILED
1197
1198
#---------------------------------------------------------------
1199
TEST=38; echo $TEST "-s"
1200
$s $AWK '
1201
BEGIN {
1202
for(i=1; i<50; i++)
1203
for(j=1; j<=i; j++) {
1204
print i, 2 >"in"
1205
print i, 1 >"in1"
1206
}
1207
}' </dev/null
1208
1209
$s $SORT -m -s -k1,1n in in1 >out
1210
1211
$s $AWK '
1212
func stop() { print "'$TEST' FAILED"; exit }
1213
$1!=last1 { if(count!=last1 || $2!=2) stop();
1214
count = 0}
1215
$1==last1 && $2!=last2 { if(count!=last1 || $2!=1) stop();
1216
count = 0 }
1217
{ count++; last1 = $1; last2 = $2 }
1218
' out
1219
1220
#---------------------------------------------------------------
1221
TEST=39; echo $TEST "empty fields"
1222
cat >in <<!
1223
bXXa
1224
aXXb
1225
!
1226
cp in out
1227
1228
./xsort A -k3 -tX
1229
./xsort B -k2 -tX
1230
./xsort C -r -k2,2 -tX
1231
./xsort D -r -k4 -tX
1232
1233
#---------------------------------------------------------------
1234
TEST=40; echo $TEST "deceptive field boundaries"
1235
cat >in <<!
1236
1.2
1237
1.10
1238
!
1239
cp in out
1240
1241
./xsort A -t. -k1,1n -k2,2n
1242
./xsort B -t. -k1nr -k2n
1243
1244
cat >in <<!
1245
feb
1246
jan
1247
jan
1248
feb
1249
!
1250
cp in out
1251
1252
$M ./xsort C -k1.1,1.4M
1253
#---------------------------------------------------------------
1254
TEST=41; echo $TEST "fixed length records"
1255
echo bdpoweonwekjbkgizohoeioilasho > in
1256
echo hozopoonbkkjoieigishwewebdlao > out
1257
1258
$k ./xsort A -s -r -R2 -k.2.1
1259
1260
( echo; echo ) >> in
1261
1262
cat >out <<!
1263
zoweweshpoonoio
1264
lakjhogieibkbd
1265
1266
!
1267
1268
$k ./xsort B -s -r -R2
1269
1270
echo ' aza zaz mzm mam
1271
1272
1273
' > in
1274
1275
echo ' zaz mam mzm aza
1276
1277
1278
' > out
1279
1280
$k ./xsort C -s -r -R4 -k.2.1
1281
$k ./xsort D -s -r -R4 -k1.2,1.2
1282
1283
echo ' zaz mzm mam aza
1284
1285
1286
' > out
1287
1288
$k ./xsort E -s -r -R4 -k.2.2
1289
$k ./xsort F -s -r -R4 -k1.2,1.3
1290
$k ./xsort G -s -r -R4 -k1.2,1.2 -k1.3,1.3
1291
1292
echo ' mzm aza zaz mam
1293
1294
1295
' > out
1296
1297
$k ./xsort H -s -r -R4 -k1.3,1.3 -k1.2,1.2
1298
1299
done
1300
1301