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