|
|
1.1 root 1: #!/bin/sh
2:
3: # Tests for the Unix sort utility
4: # Test Posix features except for locale.
5: # Test some nonstandard features if present.
6:
7: # Other tests may be needed for files too big to fit in memory;
8: # see TEST=15 below
9:
10: #---------------------------------------------------------------
11: echo pathname of sort under test:
12: which sort 2>/dev/null || whatis sort 2>/dev/null || echo can\'t tell
13:
14: #---------------------------------------------------------------
15: # Initialize switches for nonstandard features.
16: # Use parenthesized settings for supported features.
17:
18: o=: # officially obsolescent features: +1 -2, misplaced -o (o=)
19: g=: # -g numeric sort including e-format numbers (g=)
20: M=: # -M sort by month names (M=)
21: s=: # -s stable, do not compare raw bytes on equal keys (s=)
22: y= # -y user-specified memory size (y=-y10000)
23:
24: # Detect what features are supported, assuming bad options cause
25: # errors. Set switches accordingly.
26:
27: echo obsolescent and nonstandard features recognized, if any:
28: if sort +0 </dev/null 2>/dev/null; then o=
29: echo ' +1 -2'; fi
30: if sort /dev/null -o xx 2>/dev/null; then o=
31: echo ' -o among files'; fi
32: if sort -g </dev/null 2>/dev/null; then g=
33: echo ' -g g-format numbers'; fi
34: if sort -M </dev/null 2>/dev/null; then M=
35: echo ' -M months'; fi
36: if sort -s </dev/null 2>/dev/null; then s=
37: echo ' -s stable'; fi
38: if sort -y10000 </dev/null 2>/dev/null; then y=-y10000
39: echo ' -y space'; fi
40: if sort -z10000 </dev/null 2>/dev/null; then
41: echo ' -z recsize (not exercised)'; fi
42: if sort -T. </dev/null 2>/dev/null; then
43: echo ' -T tempdir (not exercised)'; fi
44:
45: #---------------------------------------------------------------
46: # look for a modern awk
47:
48: if nawk 'BEGIN{print rand()}' </dev/null >/dev/null 2>&1
49: then awk=nawk
50: elif gawk 'BEGIN{print rand()}' </dev/null >/dev/null 2>&1
51: then awk=gawk
52: elif awk 'BEGIN{print rand()}' </dev/null >/dev/null 2>&1
53: then awk=awk
54: else echo "missing or old awk, inadequate for some tests; may dump core"
55: awk=awk
56: fi
57:
58: awkf="echo awk failed in test"
59: export awk awkf
60:
61: #---------------------------------------------------------------
62: export TEST # major sequence number of test
63:
64: trap "rm -f in in1 in2 out xx -k - -o unwritablefile xsort ysort linecount checksum
65: exit" 0 1 2 13 15
66:
67:
68: #---------------------------------------------------------------
69: # shell program: xsort testno options
70: # Sort file "in" with specified options.
71: # Compare with file "out" if that is supplied,
72: # otherwise make plausibility checks on output
73:
74: cat <<'!' >xsort; chmod +x xsort
75:
76: X=$1; shift
77:
78: if sort "$@" in >xx && sort -c "$@" xx 2>/dev/null
79: then
80: if test -f out
81: then
82: cmp xx out >/dev/null && exit 0
83: echo $TEST$X comparison failed
84: else
85: test "`checksum <in`" = "`checksum <xx`" && exit 0
86: echo $TEST$X checksum failed
87: fi
88: else
89: echo $TEST$X failed
90: fi
91: exit 1
92: !
93:
94: #---------------------------------------------------------------
95: # shell program: linecount testno file count
96: # declares the given "testno" to be in error if number of
97: # lines in "file" differs from "count"
98:
99: cat <<'!' >linecount
100: $awk 'END{ if(NR!='$3') print "'$TEST$1' failed"
101: }' $2 2>/dev/null || $awkf $TEST$1
102: !
103: chmod +x linecount
104:
105: #---------------------------------------------------------------
106: # c program: checksum insensitive to reordering input
107:
108: cat <<! >checksum.c
109: #include <stdio.h>
110:
111: enum { /* primes just short of 32-bit overflows */
112: C1 = 2130706703,
113: C2 = 16776937
114: };
115:
116: main()
117: {
118: int c;
119: long n;
120: long sum = 0;
121: long linesum = 0;
122: for(n=0; (c=getchar())!=EOF; n++)
123: if(c == '\n') {
124: sum = (sum + linesum) % C1;
125: linesum = 0;
126: } else
127: linesum = ((linesum<<7) + c) % C2;
128: printf("%ld %ld\n", sum, n);
129: }
130: !
131: cc checksum.c -o checksum
132:
133:
134: rm -f out
135:
136: #---------------------------------------------------------------
137: TEST=01; echo $TEST # -c status, checksum
138: # obsolescent features go together
139: cat <<! >in
140: b
141: a
142: !
143: rm -f out -o
144:
145: sort -c in 2>/dev/null && echo ${TEST}A failed
146:
147: xsort B || echo checksum program may not work
148:
149: $o sort +0 in -o in || echo ${TEST}c failed
150:
151: #---------------------------------------------------------------
152: TEST=02; echo $TEST # output from -c
153: cat <<! >in
154: x
155: y
156: !
157:
158: sort -cr in >out 2>xx && echo ${TEST}A failed
159: test -s out && echo ${TEST}B failed
160: test -s xx && echo option -c is noisy "(probably legal)"
161: test -s xx || echo option -c is quiet "(legal, not classical)"
162:
163: sort -c /dev/null 2>xx || echo ${TEST}C failed
164: test -s xx && echo ${TEST}D failed
165:
166: #---------------------------------------------------------------
167: TEST=03; echo $TEST # -n
168: cat <<! >in
169: -99.0
170: -99.1
171: -.0002
172: -10
173: 2
174: 2.0x
175: 2.0.1
176: 0010.000000000000000000000000000000000001
177: 10
178: 3x
179: x
180: !
181: cat <<! >out
182: -99.1
183: -99.0
184: -10
185: -.0002
186: x
187: 2
188: 2.0.1
189: 2.0x
190: 3x
191: 10
192: 0010.000000000000000000000000000000000001
193: !
194:
195: xsort "" -n
196:
197: #---------------------------------------------------------------
198: TEST=04; echo $TEST # -b without fields, piping, -c status return
199: cat <<! >in
200: b
201: a
202: !
203: cp in out
204:
205: xsort A -b
206:
207: cat in | sort | cat >xx
208: cmp xx out >/dev/null || echo ${TEST}B failed
209:
210: sort in | sort -cr 2>/dev/null && echo ${TEST}C failed
211:
212: #---------------------------------------------------------------
213: TEST=05; echo $TEST # fields, reverse fields, -c status return
214: cat <<! >in
215: b b p
216: a b q
217: x a
218: !
219: cat <<! >out
220: x a
221: a b q
222: b b p
223: !
224:
225: $o xsort A +1 -2
226:
227: $o xsort B +1 -2 +2r
228:
229: xsort C -k 2,2
230:
231: xsort D -k 2,2 -k 3r
232:
233: xsort E -k 2,2.0
234:
235: xsort F -k 2,2 -k 1,1 -k 3
236:
237: sort -c -k 2 in 2>/dev/null && ${TEST}G failed
238:
239: #---------------------------------------------------------------
240: TEST=06; echo $TEST # -t
241: cat <<! >in
242: a:
243: a!
244: !
245: cp in out
246:
247: $o xsort A -t : -r +0
248:
249: $o xsort B -t : +0 -1
250:
251: xsort C -t : -r -k 1
252:
253: xsort D -t : -k 1,1
254:
255: #---------------------------------------------------------------
256: TEST=07; echo $TEST # -t, character positions in fields
257: # -t: as 1 arg is not strictly conforming, but classical
258: cat <<! >in
259: : ab
260: :bac
261: !
262: cat <<! >out
263: :bac
264: : ab
265: !
266:
267: $o xsort A -b -t: +1.1
268:
269: $o xsort B -t: +1.1r
270:
271: xsort C -b -t: -k 2.2
272:
273: xsort D -t: -k 2.2r
274:
275: #---------------------------------------------------------------
276: TEST=08; echo $TEST # space and tab as -t characters
277: cat <<! >in
278: b c
279: b c
280: b c
281: !
282: cp in out
283:
284: xsort A -t ' ' -k2,2
285:
286: xsort B -t ' ' -k2.1,2.0
287:
288: cat <<! >out
289: b c
290: b c
291: b c
292: !
293:
294: xsort C -t ' ' -k2,2
295:
296: xsort D -t ' ' -k2.1,2.0
297:
298: cat <<! >out
299: b c
300: b c
301: b c
302: !
303:
304: xsort E -k2
305:
306: cat <<! >out
307: b c
308: b c
309: b c
310: !
311:
312: xsort F -k2b
313:
314: #---------------------------------------------------------------
315: TEST=09; echo $TEST # alphabetic as -t character
316: cat <<! >in
317: zXa
318: yXa
319: zXb
320: !
321: cp in out
322:
323: xsort "" -tX -k2 -k1r,1
324:
325: #---------------------------------------------------------------
326: TEST=10; echo $TEST # -m
327: cat <<! >in
328: a
329: ab
330: ab
331: bc
332: ca
333: !
334: cat <<! >in1
335: Z
336: a
337: aa
338: ac
339: c
340: !
341: cat <<! >out
342: Z
343: a
344: a
345: aa
346: ab
347: ab
348: ac
349: bc
350: c
351: ca
352: !
353:
354: sort -m in in1 >xx
355: cmp xx out >/dev/null || echo ${TEST}A failed
356:
357: #---------------------------------------------------------------
358: TEST=11; echo $TEST # multiple files, -o overwites input, -m, -mu
359: cat <<! >in
360: a
361: b
362: c
363: d
364: !
365:
366: sort -o xx in in in in in in in in in in in in in in in in in
367: linecount A xx 68
368: sort -o in -mu in in in in in in in in in in in in in in in in in
369: linecount B in 4
370: sort -o in -m in in in in in in in in in in in in in in in in in
371:
372: cmp in xx >/dev/null || echo ${TEST}C failed
373:
374: #---------------------------------------------------------------
375: TEST=12; echo $TEST # does -mu pick the first among equals?
376: cat <<! >in
377: 3B
378: 3b
379: 3B2
380: ~3B2
381: 4.1
382: 41
383: 5
384: 5.
385: !
386: cat <<! >out
387: 3B
388: 3B2
389: 4.1
390: 5
391: !
392:
393: xsort A -mudf || echo "(other behavior is legal, not classical)"
394:
395: xsort B -mudf -k1 || echo "(other behavior is legal, not classical)"
396:
397: #---------------------------------------------------------------
398: TEST=13; echo $TEST # long records (>8000 bytes, keys >16000), -r
399: $awk '
400: BEGIN { x="x"
401: for(i=1; i<=12; i++) x = x x
402: for(i=15; i<=25; i++) print x i
403: }' >in </dev/null 2>/dev/null || $awkf $TEST
404: $awk '
405: BEGIN { x="x"
406: for(i=1; i<=12; i++) x = x x
407: for(i=25; i>=15; i--) print x i
408: }' >out </dev/null 2>/dev/null || $awkf $TEST
409:
410: xsort A -r
411:
412: xsort B -k 1,1r -k 1
413:
414: #---------------------------------------------------------------
415: TEST=14; echo $TEST "(3 long parts)"
416: $awk 'BEGIN { for(i=0; i<100000; i++) {
417: x = rand(); if(x !~ /e/) print x }
418: }' </dev/null >in 2>/dev/null || $awkf $TEST
419: rm -f out
420:
421: xsort A; echo $TEST "(part A done)"
422:
423: xsort B -n; echo $TEST "(part B done)"
424:
425: # next test is unclean: xx is a hidden side-effect of xsort
426:
427: $awk '
428: $0 < x { print "test '${TEST}C' failed"; exit }
429: $0 "" != x { print >"out"; x = $0 }
430: ' xx 2>/dev/null || $awkf ${TEST}C
431:
432: xsort C -n -u
433:
434: #---------------------------------------------------------------
435: TEST=15; echo $TEST "(long)" # force intermediate files if possible
436: # with option -y 10000 ($y) this makes 50 intermediat
437: # files of 80-byte records.
438: case "$y" in
439: "") echo "sorttest warning: inadequate test of large files; revise parameters"
440: esac
441:
442: $awk 'BEGIN {
443: x = "xxxxxxxxxx"
444: x = x x x x x x x x
445: for(i=0; i<4000; i++) print rand(), x
446: }' >in </dev/null 2>/dev/null || $awkf $TEST
447: rm -f out
448:
449: xsort A -r $y
450:
451: rm -f in1
452: sort -r in -o in1
453: $awk '$0 "x" != x { print ; x = $0 "x"
454: }' in1 >out 2>/dev/null || $awkf ${TEST}B
455:
456: xsort B -u -r $y
457:
458: sort -r -u -m in1 -o in1
459: cmp in1 out >/dev/null || echo ${TEST}C failed
460: rm in in1 out
461:
462: #---------------------------------------------------------------
463: TEST=16; echo $TEST # -nr, -nm, file name -
464: $awk 'BEGIN { for(i=-100; i<=100; i+=2) printf "%.10d\n", i
465: }' >in </dev/null 2>/dev/null || $awkf $TEST
466:
467: ($awk 'BEGIN { for(i=-99; i<=100; i+=2) print i
468: }' </dev/null 2>/dev/null || $awkf ${TEST}A) | sort -nr in - >xx
469: $awk '$0+0 != 101-NR { print "'${TEST}A' failed"; exit
470: }' xx 2>/dev/null || $awkf ${TEST}A
471:
472: ($awk 'BEGIN { for(i=-99; i<=100; i+=2) print i
473: }' </dev/null 2>/dev/null || $awkf ${TEST}B) | sort -mn - in >xx
474: $awk '$0+0 != -101+NR { print "'${TEST}B' failed"; exit
475: }' xx 2>/dev/null || $awkf ${TEST}B
476:
477: #---------------------------------------------------------------
478: TEST=17; echo $TEST # -d, fields without end, modifier override
479: cat <<! >in
480: a-B
481: a+b
482: a b
483: A+b
484: a b
485: !
486: cat <<! >out
487: a b
488: a b
489: A+b
490: a-B
491: a+b
492: !
493:
494: $o xsort A -df +0 +0d
495:
496: xsort B -df -k 1 -k 1d
497:
498: #---------------------------------------------------------------
499: TEST=18; echo $TEST # -u on key only
500: cat <<! >in
501: 12 y
502: 13 z
503: 12 x
504: !
505: cat <<! >out
506: 12 x
507: 12 y
508: 13 z
509: !
510:
511: $o xsort A +0 -1
512:
513: xsort B -k 1,1
514:
515: sort -u -k 1,1 in >xx
516: linecount C xx 2
517:
518: #---------------------------------------------------------------
519: TEST=19; echo $TEST # -i, -d, -f
520: cat <<! >xx.c
521: run(i,j){ for( ; i<=j; i++) printf("%.3o %c\n",i,i); }
522: main(){ run(0, 011); /* 012=='\n' */
523: run(013, 0377); }
524: !
525: cc xx.c
526: a.out >in
527: cat <<! >xx.c
528: run(i,j){ for( ; i<=j; i++) printf("%.3o %c\n",i,i); }
529: main(){ run(0, 011);
530: run(013, ' '-1);
531: run(0177, 0377);
532: run(' ', 0176); }
533: !
534: cc xx.c
535: a.out >out
536:
537: xsort A -i -k 2
538:
539: cat <<! >xx.c
540: run(i,j){ for( ; i<=j; i++) printf("%.3o %c\n",i,i); }
541: main(){ run(0, 010); /* 011=='\t', 012=='\n' */
542: run(013, ' '-1);
543: run(' '+1, '0'-1);
544: run('9'+1, 'A'-1);
545: run('Z'+1, 'a'-1);
546: run('z'+1, 0377);
547: run('\t', '\t');
548: run(' ', ' ');
549: run('0', '9');
550: run('A', 'Z');
551: run('a', 'z'); }
552: !
553: cc xx.c
554: a.out >out
555:
556: xsort B -d -k 2
557:
558: cat <<! >xx.c
559: run(i,j){ for( ; i<=j; i++) printf("%.3o %c\n",i,i); }
560: main(){ int i;
561: run(0, 011);
562: run(013, 'A'-1);
563: for(i='A'; i<='Z'; i++)
564: printf("%.3o %c\n%.3o %c\n",i,i,i+040,i+040);
565: run('Z'+1, 'a'-1);
566: run('z'+1, 0377); }
567: !
568: cc xx.c
569: a.out >out
570: rm xx.c
571:
572: xsort C -f -k 2
573:
574: #---------------------------------------------------------------
575: TEST=20; echo $TEST # -d, -f, -b applies only to fields
576: cat <<! >in
577: b
578: 'C
579: a
580: !
581: cp in out
582:
583: xsort A -d
584:
585: xsort B -f
586:
587: cat <<! >out
588: b
589: a
590: 'C
591: !
592:
593: xsort C -dfb
594:
595: #---------------------------------------------------------------
596: TEST=21; echo $TEST # behavior of null bytes
597: cat <<'!' >xx.c
598: main() { printf("\n%cb\n%ca\n",0,0); }
599: !
600: cc xx.c
601: a.out >in
602: sort -u in >xx
603: cmp in xx >/dev/null && echo ${TEST}A failed
604: test "`wc -c <in`" = "`wc -c <xx`" || echo ${TEST}B failed
605: rm xx.c a.out
606:
607: #---------------------------------------------------------------
608: TEST=22; echo $TEST # field limits
609: cat <<! >in
610: a 2
611: a 1
612: b 2
613: b 1
614: !
615: cat <<! >out
616: b 1
617: b 2
618: a 1
619: a 2
620: !
621:
622: xsort "" -r -k1,1 -k2n
623:
624: #---------------------------------------------------------------
625: TEST=23; echo $TEST # empty file, compact -o
626:
627: echo hi >xx
628:
629: sort -oxx </dev/null
630: cmp xx /dev/null >/dev/null || echo ${TEST}A failed
631:
632: sort -c </dev/null || echo ${TEST}B failed
633:
634: sort -cu </dev/null || echo ${TEST}C failed
635:
636: #---------------------------------------------------------------
637: TEST=24; echo $TEST # many fields
638: cat <<! >in
639: 0:2:3:4:5:6:7:8:9
640: 1:1:3:4:5:6:7:8:9
641: 1:2:2:4:5:6:7:8:9
642: 1:2:3:3:5:6:7:8:9
643: 1:2:3:4:4:6:7:8:9
644: 1:2:3:4:5:5:7:8:9
645: 1:2:3:4:5:6:6:8:9
646: 1:2:3:4:5:6:7:7:9
647: 1:2:3:4:5:6:7:8:8
648: !
649: cat <<! >out
650: 1:2:3:4:5:6:7:8:8
651: 1:2:3:4:5:6:7:7:9
652: 1:2:3:4:5:6:6:8:9
653: 1:2:3:4:5:5:7:8:9
654: 1:2:3:4:4:6:7:8:9
655: 1:2:3:3:5:6:7:8:9
656: 1:2:2:4:5:6:7:8:9
657: 1:1:3:4:5:6:7:8:9
658: 0:2:3:4:5:6:7:8:9
659: !
660:
661: xsort "" -t: -k9 -k8 -k7 -k6 -k5 -k4 -k3 -k2 -k1
662:
663: #---------------------------------------------------------------
664: TEST=25; echo $TEST # variously specified alpha fields
665: # numbers give the correct orderings
666: cat <<! >in
667: 01:04:19:01:16:01:21:01 a
668: 02:03:13:15:13:19:15:02 a
669: 03:02:07:09:07:13:09:03 a
670: 04:01:01:03:01:07:03:04 a
671: 05:08:20:16:17:02:20:05 aa
672: 06:07:14:18:14:20:14:06 aa
673: 07:06:08:10:08:14:08:07 aa
674: 08:05:02:04:02:08:02:08 aa
675: 09:16:22:02:22:04:24:13 b
676: 10:15:16:20:19:22:18:14 b
677: 11:14:10:12:10:16:12:15 b
678: 12:13:04:06:04:10:06:16 b
679: 13:24:24:22:24:06:22:21 bb
680: 14:23:18:24:21:24:16:22 bb
681: 15:22:12:14:12:18:10:23 bb
682: 16:21:06:08:06:12:04:24 bb
683: 17:12:21:21:18:03:19:09 ab
684: 18:11:15:19:15:21:13:10 ab
685: 19:10:09:11:09:15:07:11 ab
686: 20:09:03:05:03:09:01:12 ab
687: 21:20:23:17:23:05:23:17 ba
688: 22:19:17:23:20:23:17:18 ba
689: 23:18:11:13:11:17:11:19 ba
690: 24:17:05:07:05:11:05:20 ba
691: !
692: sort -k2b -k2 in >xx
693: sort -c -t: -k2n xx 2>/dev/null || echo ${TEST}A failed
694: sort -k2,2.1b -k2 in >xx
695: sort -c -t: -k3n xx 2>/dev/null || echo ${TEST}B failed
696: sort -k2.3 -k2 in >xx
697: sort -c -t: -k4n xx 2>/dev/null || echo ${TEST}C failed
698: sort -k2b,2.3 -k2 in >xx
699: sort -c -t: -k5n xx 2>/dev/null || echo ${TEST}D failed
700: sort -k2.3,2.1b -k2 in >xx
701: sort -c -t: -k6n xx 2>/dev/null || echo ${TEST}E failed
702: sort -k2,2.1b -k2r in >xx
703: sort -c -t: -k7n xx 2>/dev/null || echo ${TEST}F failed
704: sort -b -k2,2 -k2 in >xx
705: sort -c -t: -k8n xx 2>/dev/null || echo ${TEST}G failed
706: sort -b -k2,2b -k2 in >xx # perhaps same as G
707: sort -c -t: -k3n xx 2>/dev/null || echo ${TEST}H failed\
708: "(standard is not clear on this)"
709:
710: #---------------------------------------------------------------
711: TEST=26; echo $TEST # empty fields, out of bounds fields
712: cat <<! >in
713: 0 5
714: 1 4
715: 2 3
716: 3 2
717: 4 1
718: 5 0
719: !
720: cp in out
721:
722: xsort "" -k2.2,2.1 -k2.3,2.4
723:
724: #---------------------------------------------------------------
725: TEST=27; echo $TEST # displaced -o
726: rm -f out
727:
728: $o sort /dev/null -o out || $o echo ${TEST}B failed
729: $o test -f out || $o echo ${TEST}C failed
730:
731: #---------------------------------------------------------------
732: TEST=28; echo $TEST # apparently nonmonotone field specs
733: cat <<! >in
734: aaaa c
735: x a
736: 0 b
737: !
738: cp in out
739:
740: $o xsort A +1 -0.3 +1.4 -1.5
741:
742: xsort B -k2,1.3 -k2.5,2.5
743:
744: #---------------------------------------------------------------
745: TEST=29; echo $TEST # determination of end of option list
746: cat >-k <<!
747: x
748: !
749: rm -f out -c
750:
751: sort -- -k </dev/null >xx || echo ${TEST}A argument failed
752: cmp xx -k || echo ${TEST}A comparison failed
753:
754: cat >in <<!
755: xxx
756: !
757: >-
758: >-o
759: >in1
760:
761: sort -- - -o in1 <in >out
762: cmp in out >/dev/null || echo ${TEST}C failed
763: test -s in1 && echo ${TEST}D failed
764:
765: #---------------------------------------------------------------
766: TEST=30; echo $TEST # missing newline
767: $awk 'BEGIN{ printf "%s", "x"}' >in 2>/dev/null || $awkf $TEST
768: echo x >out
769:
770: xsort "" 2>/dev/null
771:
772: #---------------------------------------------------------------
773: TEST=31; echo $TEST # -M, multiple fields
774: cat <<! >in
775: jan 10 1900
776: Feb 26 1900
777: feb 25 1900
778: January xx 1900
779: August 11 1900
780: jan 15 1990
781: feb 22 1990
782: mar 15 1990
783: apr 1 1990
784: may 45 1990
785: jun 14 1990
786: jul 4 1990
787: aug 1~ 1990
788: aug 11 1990
789: sep 1 1990
790: oct 12 1990
791: nov 24 1990
792: dec 25 1990
793: never 3 1990
794: Dec 25 1990
795: !
796: cat <<! >out
797: January xx 1900
798: jan 10 1900
799: feb 25 1900
800: Feb 26 1900
801: August 11 1900
802: never 3 1990
803: jan 15 1990
804: feb 22 1990
805: mar 15 1990
806: apr 1 1990
807: may 45 1990
808: jun 14 1990
809: jul 4 1990
810: aug 1~ 1990
811: aug 11 1990
812: sep 1 1990
813: oct 12 1990
814: nov 24 1990
815: Dec 25 1990
816: dec 25 1990
817: !
818:
819: $M xsort "" -k3n -k1M -k2n
820:
821: #---------------------------------------------------------------
822: TEST=32; echo $TEST # -M case insensitivity, -r
823: cat <<! >in
824: x
825: june
826: january
827: december
828: !
829: cat <<! >out
830: december
831: june
832: january
833: x
834: !
835:
836: $M xsort "" -Mr
837:
838: #---------------------------------------------------------------
839: TEST=33; echo $TEST # -g, big enough for IEEE floating point
840: cat <<! >in
841: 2
842: 1
843: 10
844: 1e-1
845: .2
846: 1e
847: 1E1
848: 1e.
849: 3e+308
850: 3e307
851: 1e-308
852: 1e-307
853: !
854: cat <<! >out
855: 1e-308
856: 1e-307
857: 1e-1
858: .2
859: 1
860: 1e
861: 1e.
862: 2
863: 10
864: 1E1
865: 3e307
866: 3e+308
867: !
868:
869: $g xsort "" -g
870:
871: #---------------------------------------------------------------
872: TEST=34; echo $TEST # -g wide operands
873: cat <<! >in
874: .99999999999999999999
875: 099999999999999999999e-21
876: 099999999999999999999e-19
877: .1e1
878: !
879: cat <<! >out
880: 099999999999999999999e-21
881: .99999999999999999999
882: .1e1
883: 099999999999999999999e-19
884: !
885:
886: $g xsort A -g
887:
888: cat <<! >out
889: .1e1
890: .99999999999999999999
891: 099999999999999999999e-19
892: 099999999999999999999e-21
893: !
894:
895: xsort B -n
896:
897: #---------------------------------------------------------------
898: TEST=35; echo $TEST #-g, -u with different fp reps
899: cat <<! >in
900: +0
901: -0
902: 0
903: 0.10
904: +.1
905: -.1
906: -100e-3x
907: x
908: !
909: cat <<! >out
910: -.1
911: -100e-3x
912: +0
913: -0
914: 0
915: x
916: +.1
917: 0.10
918: !
919:
920: $g xsort A -g
921:
922: $g sort -gu in >xx && $g sort -c -gu xx || echo ${TEST}B failed
923: $g linecount C xx 3
924:
925: #---------------------------------------------------------------
926: TEST=36; echo $TEST # -s
927: cat <<! >in
928: a 2
929: b 1
930: c 2
931: a 1
932: b 2
933: c 1
934: !
935: cat <<! >out
936: a 2
937: a 1
938: b 1
939: b 2
940: c 2
941: c 1
942: !
943:
944: $s xsort "" -s -k1,1
945:
946: #---------------------------------------------------------------
947: TEST=37; echo $TEST # -s, multiple files
948: cat <<! >in
949: a 2
950: c 2
951: !
952: cat <<! >in1
953: a 1
954: b 1
955: c 1
956: !
957: cat <<! >out
958: c 2
959: b 1
960: a 2
961: !
962:
963: $s sort -smru -k1,1 in in in1 in1 >xx
964: $s cmp xx out >/dev/null || echo $TEST failed
965:
966: #---------------------------------------------------------------
967: TEST=38; echo $TEST # -s
968: $s $awk '
969: BEGIN {
970: for(i=1; i<50; i++)
971: for(j=1; j<=i; j++) {
972: print i, 2 >"in"
973: print i, 1 >"in1"
974: }
975: }' </dev/null 2>/dev/null || $awkf $TEST
976:
977: $s sort -m -s -k1,1n in in1 >out
978:
979: $s $awk '
980: func stop() { print "'$TEST' failed"; exit }
981: $1!=last1 { if(count!=last1 || $2!=2) stop();
982: count = 0}
983: $1==last1 && $2!=last2 { if(count!=last1 || $2!=1) stop();
984: count = 0 }
985: { count++; last1 = $1; last2 = $2 }
986: ' out 2>/dev/null || $awkf $TEST
987:
988: #---------------------------------------------------------------
989: TEST=39; echo $TEST # empty fields
990: cat <<! >in
991: bXXa
992: aXXb
993: !
994: cp in out
995:
996: xsort A -k3 -tX
997: xsort B -k2 -tX
998: xsort C -r -k2,2 -tX
999: xsort D -r -k4 -tX
1000:
1001: #---------------------------------------------------------------
1002: TEST=40; echo $TEST # deceptive field boundaries
1003: cat <<! >in
1004: 1.2
1005: 1.10
1006: !
1007: cp in out
1008:
1009: xsort A -t. -k1,1n -k2,2n
1010: xsort B -t. -k1nr -k2n
1011:
1012: cat <<! >in
1013: feb
1014: jan
1015: jan
1016: feb
1017: !
1018: cp in out
1019:
1020: $M xsort C -k1.1,1.4M
1021:
1022: #---------------------------------------------------------------
1023: TEST=41; echo $TEST # diagnostics
1024:
1025: echo hi >in
1026:
1027: cat <<\! >ysort
1028: error=0 warning=0 works=0
1029: sort "$@" 2>out <in >in1 || error=1
1030: test -s out && warning=1
1031: test -s in1 && works=1
1032: case $error$warning$works in
1033: 000) echo sort "$@" does not indicate trouble, but does not sort ;;
1034: 001) echo sort "$@" does not indicate trouble ;;
1035: 010) echo sort "$@" warns, does not sort, and yields exit status zero ;;
1036: 011) echo sort "$@" warns and continues ;;
1037: 100) echo sort "$@" yields nonzero exit status and does not sort ;;
1038: 101) echo sort "$@" yields nonzero exit status, but sorts ;;
1039: 111) echo sort "$@" warns and yields nonzero exit status, but sorts
1040: esac
1041: !
1042: chmod +x ysort
1043: echo "behavior (other than message and error exit)"
1044: echo " in some questionable cases:"
1045:
1046: rm -f nosuchfile
1047: ysort nosuchfile
1048:
1049: echo x >unwritablefile
1050: chmod 0 unwritablefile
1051: ysort -o unwritablefile </dev/null
1052:
1053: cat in | ysort - -
1054:
1055: for i in -k -k0 -k-1 -k1, -kb -k1,2u -t -o
1056: do ysort $i
1057: done
1058:
1059: $g ysort -n -g
1060: $M ysort -n -M
1061: ysort -d -i
1062: ysort -n -i
1063: ysort -c in in
1064: ysort -t. -t:
1065:
1066: for i in -a -e -h -j -p -q -v -w -x -0 -1 -2
1067: do ysort $i
1068: done
1069:
1070: $g false && ysort -g
1071: $s false && ysort -s
1072: $z false && ysort -z
1073:
1074: case "$y" in
1075: "") ysort -y
1076: esac
1077:
1078: ysort -k1,1 -f
1079:
1080: cat <<! >in
1081: A b
1082: a bc
1083: a Bd
1084: B
1085: !
1086: cat <<! >in1
1087: A b
1088: B
1089: a bc
1090: a Bd
1091: !
1092: cat <<! >in2
1093: A b
1094: B
1095: a Bd
1096: a bc
1097: !
1098:
1099: if sort -k1,1 -f -k2,2 <in >out 2>/dev/null
1100: then
1101: echo sort -k1,1 -f -k2,2 :
1102: if cmp out in >/dev/null
1103: then echo " -f applies to fields 1 and 2"
1104: elif cmp out in1 >/dev/null
1105: then echo " -f applies to field 2 only"
1106: elif cmp out in1 >/dev/null
1107: then echo " -f ineffectual"
1108: elif cmp out /dev/null >/dev/null
1109: then echo " exit status zero, but no output"
1110: else echo " inexplicable"
1111: fi
1112: fi
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.