home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 22 gnu / 22-gnu.zip / gnuawk.zip / awklib / eg / prog / cut.awk < prev    next >
Text File  |  1997-03-15  |  4KB  |  137 lines

  1. # cut.awk --- implement cut in awk
  2. # Arnold Robbins, arnold@gnu.ai.mit.edu, Public Domain
  3. # May 1993
  4.  
  5. # Options:
  6. #    -f list        Cut fields
  7. #    -d c           Field delimiter character
  8. #    -c list        Cut characters
  9. #
  10. #    -s        Suppress lines without the delimiter character
  11.  
  12. function usage(    e1, e2)
  13. {
  14.     e1 = "usage: cut [-f list] [-d c] [-s] [files...]"
  15.     e2 = "usage: cut [-c list] [files...]"
  16.     print e1 > "/dev/stderr"
  17.     print e2 > "/dev/stderr"
  18.     exit 1
  19. }
  20. BEGIN    \
  21. {
  22.     FS = "\t"    # default
  23.     OFS = FS
  24.     while ((c = getopt(ARGC, ARGV, "sf:c:d:")) != -1) {
  25.         if (c == "f") {
  26.             by_fields = 1
  27.             fieldlist = Optarg
  28.         } else if (c == "c") {
  29.             by_chars = 1
  30.             fieldlist = Optarg
  31.             OFS = ""
  32.         } else if (c == "d") {
  33.             if (length(Optarg) > 1) {
  34.                 printf("Using first character of %s" \
  35.                 " for delimiter\n", Optarg) > "/dev/stderr"
  36.                 Optarg = substr(Optarg, 1, 1)
  37.             }
  38.             FS = Optarg
  39.             OFS = FS
  40.             if (FS == " ")    # defeat awk semantics
  41.                 FS = "[ ]"
  42.         } else if (c == "s")
  43.             suppress++
  44.         else
  45.             usage()
  46.     }
  47.  
  48.     for (i = 1; i < Optind; i++)
  49.         ARGV[i] = ""
  50.     if (by_fields && by_chars)
  51.         usage()
  52.  
  53.     if (by_fields == 0 && by_chars == 0)
  54.         by_fields = 1    # default
  55.  
  56.     if (fieldlist == "") {
  57.         print "cut: needs list for -c or -f" > "/dev/stderr"
  58.         exit 1
  59.     }
  60.  
  61.     if (by_fields)
  62.         set_fieldlist()
  63.     else
  64.         set_charlist()
  65. }
  66. function set_fieldlist(        n, m, i, j, k, f, g)
  67. {
  68.     n = split(fieldlist, f, ",")
  69.     j = 1    # index in flist
  70.     for (i = 1; i <= n; i++) {
  71.         if (index(f[i], "-") != 0) { # a range
  72.             m = split(f[i], g, "-")
  73.             if (m != 2 || g[1] >= g[2]) {
  74.                 printf("bad field list: %s\n",
  75.                                   f[i]) > "/dev/stderr"
  76.                 exit 1
  77.             }
  78.             for (k = g[1]; k <= g[2]; k++)
  79.                 flist[j++] = k
  80.         } else
  81.             flist[j++] = f[i]
  82.     }
  83.     nfields = j - 1
  84. }
  85. function set_charlist(    field, i, j, f, g, t,
  86.                           filler, last, len)
  87. {
  88.     field = 1   # count total fields
  89.     n = split(fieldlist, f, ",")
  90.     j = 1       # index in flist
  91.     for (i = 1; i <= n; i++) {
  92.         if (index(f[i], "-") != 0) { # range
  93.             m = split(f[i], g, "-")
  94.             if (m != 2 || g[1] >= g[2]) {
  95.                 printf("bad character list: %s\n",
  96.                                f[i]) > "/dev/stderr"
  97.                 exit 1
  98.             }
  99.             len = g[2] - g[1] + 1
  100.             if (g[1] > 1)  # compute length of filler
  101.                 filler = g[1] - last - 1
  102.             else
  103.                 filler = 0
  104.             if (filler)
  105.                 t[field++] = filler
  106.             t[field++] = len  # length of field
  107.             last = g[2]
  108.             flist[j++] = field - 1
  109.         } else {
  110.             if (f[i] > 1)
  111.                 filler = f[i] - last - 1
  112.             else
  113.                 filler = 0
  114.             if (filler)
  115.                 t[field++] = filler
  116.             t[field++] = 1
  117.             last = f[i]
  118.             flist[j++] = field - 1
  119.         }
  120.     }
  121.     FIELDWIDTHS = join(t, 1, field - 1)
  122.     nfields = j - 1
  123. }
  124. {
  125.     if (by_fields && suppress && $0 !~ FS)
  126.         next
  127.  
  128.     for (i = 1; i <= nfields; i++) {
  129.         if ($flist[i] != "") {
  130.             printf "%s", $flist[i]
  131.             if (i < nfields && $flist[i+1] != "")
  132.                 printf "%s", OFS
  133.         }
  134.     }
  135.     print ""
  136. }
  137.