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