|
|
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.