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

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

unix.superglobalmegacorp.com

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