Annotation of researchv10no/cmd/sort/sorttest, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.