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

  1. # uniq.awk --- do uniq in awk
  2. # Arnold Robbins, arnold@gnu.ai.mit.edu, Public Domain
  3. # May 1993
  4.  
  5. function usage(    e)
  6. {
  7.     e = "Usage: uniq [-udc [-n]] [+n] [ in [ out ]]"
  8.     print e > "/dev/stderr"
  9.     exit 1
  10. }
  11.  
  12. # -c    count lines. overrides -d and -u
  13. # -d    only repeated lines
  14. # -u    only non-repeated lines
  15. # -n    skip n fields
  16. # +n    skip n characters, skip fields first
  17.  
  18. BEGIN    \
  19. {
  20.     count = 1
  21.     outputfile = "/dev/stdout"
  22.     opts = "udc0:1:2:3:4:5:6:7:8:9:"
  23.     while ((c = getopt(ARGC, ARGV, opts)) != -1) {
  24.         if (c == "u")
  25.             non_repeated_only++
  26.         else if (c == "d")
  27.             repeated_only++
  28.         else if (c == "c")
  29.             do_count++
  30.         else if (index("0123456789", c) != 0) {
  31.             # getopt requires args to options
  32.             # this messes us up for things like -5
  33.             if (Optarg ~ /^[0-9]+$/)
  34.                 fcount = (c Optarg) + 0
  35.             else {
  36.                 fcount = c + 0
  37.                 Optind--
  38.             }
  39.         } else
  40.             usage()
  41.     }
  42.  
  43.     if (ARGV[Optind] ~ /^\+[0-9]+$/) {
  44.         charcount = substr(ARGV[Optind], 2) + 0
  45.         Optind++
  46.     }
  47.  
  48.     for (i = 1; i < Optind; i++)
  49.         ARGV[i] = ""
  50.  
  51.     if (repeated_only == 0 && non_repeated_only == 0)
  52.         repeated_only = non_repeated_only = 1
  53.  
  54.     if (ARGC - Optind == 2) {
  55.         outputfile = ARGV[ARGC - 1]
  56.         ARGV[ARGC - 1] = ""
  57.     }
  58. }
  59. function are_equal(    n, m, clast, cline, alast, aline)
  60. {
  61.     if (fcount == 0 && charcount == 0)
  62.         return (last == $0)
  63.  
  64.     if (fcount > 0) {
  65.         n = split(last, alast)
  66.         m = split($0, aline)
  67.         clast = join(alast, fcount+1, n)
  68.         cline = join(aline, fcount+1, m)
  69.     } else {
  70.         clast = last
  71.         cline = $0
  72.     }
  73.     if (charcount) {
  74.         clast = substr(clast, charcount + 1)
  75.         cline = substr(cline, charcount + 1)
  76.     }
  77.  
  78.     return (clast == cline)
  79. }
  80. NR == 1 {
  81.     last = $0
  82.     next
  83. }
  84.     
  85. {
  86.     equal = are_equal()
  87.  
  88.     if (do_count) {    # overrides -d and -u
  89.         if (equal)
  90.             count++
  91.         else {
  92.             printf("%4d %s\n", count, last) > outputfile
  93.             last = $0
  94.             count = 1    # reset
  95.         }
  96.         next
  97.     }
  98.  
  99.     if (equal)
  100.         count++
  101.     else {
  102.         if ((repeated_only && count > 1) ||
  103.             (non_repeated_only && count == 1))
  104.                 print last > outputfile
  105.         last = $0
  106.         count = 1
  107.     }
  108. }
  109.  
  110. END {
  111.     if (do_count)
  112.         printf("%4d %s\n", count, last) > outputfile
  113.     else if ((repeated_only && count > 1) ||
  114.             (non_repeated_only && count == 1))
  115.         print last > outputfile
  116. }
  117.