uniq(1): Add some long options

These match GNU uniq(1) where appropriate for compatibility's sake.

While here, re-sort options alphabetically by the short-option.

MFC after:	1 month
This commit is contained in:
Kyle Evans 2018-05-02 01:17:08 +00:00
parent ad4e78b50a
commit a597327b90
2 changed files with 23 additions and 10 deletions

View File

@ -31,7 +31,7 @@
.\" From: @(#)uniq.1 8.1 (Berkeley) 6/6/93
.\" $FreeBSD$
.\"
.Dd May 15, 2017
.Dd May 1, 2018
.Dt UNIQ 1
.Os
.Sh NAME
@ -71,34 +71,34 @@ so it may be necessary to sort the files first.
.Pp
The following options are available:
.Bl -tag -width Ds
.It Fl c
.It Fl c , Fl -count
Precede each output line with the count of the number of times the line
occurred in the input, followed by a single space.
.It Fl d
.It Fl d , Fl -repeated
Only output lines that are repeated in the input.
.It Fl f Ar num
.It Fl f Ar num , Fl -skip-fields Ar num
Ignore the first
.Ar num
fields in each input line when doing comparisons.
A field is a string of non-blank characters separated from adjacent fields
by blanks.
Field numbers are one based, i.e., the first field is field one.
.It Fl s Ar chars
.It Fl i , Fl -ignore-case
Case insensitive comparison of lines.
.It Fl s Ar chars , Fl -skip-chars Ar chars
Ignore the first
.Ar chars
characters in each input line when doing comparisons.
If specified in conjunction with the
.Fl f
.Fl f , Fl -unique
option, the first
.Ar chars
characters after the first
.Ar num
fields will be ignored.
Character numbers are one based, i.e., the first character is character one.
.It Fl u
.It Fl u , Fl -unique
Only output lines that are not repeated in the input.
.It Fl i
Case insensitive comparison of lines.
.\".It Fl Ns Ar n
.\"(Deprecated; replaced by
.\".Fl f ) .

View File

@ -51,6 +51,7 @@ static const char rcsid[] =
#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <getopt.h>
#include <limits.h>
#include <locale.h>
#include <nl_types.h>
@ -66,6 +67,17 @@ static const char rcsid[] =
static int cflag, dflag, uflag, iflag;
static int numchars, numfields, repeats;
static const struct option long_opts[] =
{
{"count", no_argument, NULL, 'c'},
{"repeated", no_argument, NULL, 'd'},
{"skip-fields", required_argument, NULL, 'f'},
{"ignore-case", no_argument, NULL, 'i'},
{"skip-chars", required_argument, NULL, 's'},
{"unique", no_argument, NULL, 'u'},
{NULL, no_argument, NULL, 0}
};
static FILE *file(const char *, const char *);
static wchar_t *convert(const char *);
static int inlcmp(const char *, const char *);
@ -99,7 +111,8 @@ main (int argc, char *argv[])
(void) setlocale(LC_ALL, "");
obsolete(argv);
while ((ch = getopt(argc, argv, "cdif:s:u")) != -1)
while ((ch = getopt_long(argc, argv, "+cdif:s:u", long_opts,
NULL)) != -1)
switch (ch) {
case 'c':
cflag = 1;