Index: head/usr.bin/comm/comm.1 =================================================================== --- head/usr.bin/comm/comm.1 (revision 29206) +++ head/usr.bin/comm/comm.1 (revision 29207) @@ -1,95 +1,98 @@ .\" Copyright (c) 1989, 1990, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" This code is derived from software contributed to Berkeley by .\" the Institute of Electrical and Electronics Engineers, Inc. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" @(#)comm.1 8.1 (Berkeley) 6/6/93 +.\" From: @(#)comm.1 8.1 (Berkeley) 6/6/93 +.\" $Id$ .\" .Dd June 6, 1993 .Os .Dt COMM 1 .Sh NAME .Nm comm .Nd select or reject lines common to two files .Sh SYNOPSIS .Nm comm -.Op Fl 123 +.Op Fl 123i .Ar file1 file2 .Sh DESCRIPTION The .Nm comm utility reads .Ar file1 and .Ar file2 , which should be sorted lexically, and produces three text columns as output: lines only in .Ar file1 ; lines only in .Ar file2 ; and lines in both files. .Pp The filename ``-'' means the standard input. .Pp The following options are available: .Bl -tag -width Ds .It Fl 1 Suppress printing of column 1. .It Fl 2 Suppress printing of column 2. .It Fl 3 Suppress printing of column 3. +.It Fl i +Case insensitive comparison of lines. .El .Pp Each column will have a number of tab characters prepended to it equal to the number of lower numbered columns that are being printed. For example, if column number two is being suppressed, lines printed in column number one will not have any tabs preceding them, and lines printed in column number three will have one. .Pp .Nm Comm assumes that the files are lexically sorted; all characters participate in line comparisons. .Sh DIAGNOSTICS .Nm Comm exits 0 on success, >0 if an error occurred. .Sh SEE ALSO .Xr cmp 1 , .Xr diff 1 , .Xr sort 1 , .Xr uniq 1 .Sh STANDARDS The .Nm comm utility conforms to .St -p1003.2-92 . Index: head/usr.bin/comm/comm.c =================================================================== --- head/usr.bin/comm/comm.c (revision 29206) +++ head/usr.bin/comm/comm.c (revision 29207) @@ -1,185 +1,199 @@ /* * Copyright (c) 1989, 1993, 1994 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Case Larsen. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char copyright[] = "@(#) Copyright (c) 1989, 1993, 1994\n\ The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)comm.c 8.4 (Berkeley) 5/4/95"; +#if 0 +static char sccsid[] = "From: @(#)comm.c 8.4 (Berkeley) 5/4/95"; +#endif +static const char rcsid[] = + "$Id$"; #endif /* not lint */ #include #include #include #include #include #include #include #define MAXLINELEN (LINE_MAX + 1) char *tabs[] = { "", "\t", "\t\t" }; FILE *file __P((char *)); void show __P((FILE *, char *, char *)); static void usage __P((void)); int main(argc, argv) int argc; char *argv[]; { int comp, file1done, file2done, read1, read2; - int ch, flag1, flag2, flag3; + int ch, flag1, flag2, flag3, iflag; FILE *fp1, *fp2; char *col1, *col2, *col3; char **p, line1[MAXLINELEN], line2[MAXLINELEN]; flag1 = flag2 = flag3 = 1; - while ((ch = getopt(argc, argv, "-123")) != -1) + iflag = 0; + + while ((ch = getopt(argc, argv, "-123i")) != -1) switch(ch) { case '-': --optind; goto done; case '1': flag1 = 0; break; case '2': flag2 = 0; break; case '3': flag3 = 0; break; + case 'i': + iflag = 1; + break; case '?': default: usage(); } done: argc -= optind; argv += optind; if (argc != 2) usage(); fp1 = file(argv[0]); fp2 = file(argv[1]); /* for each column printed, add another tab offset */ p = tabs; col1 = col2 = col3 = NULL; if (flag1) col1 = *p++; if (flag2) col2 = *p++; if (flag3) col3 = *p; for (read1 = read2 = 1;;) { /* read next line, check for EOF */ if (read1) file1done = !fgets(line1, MAXLINELEN, fp1); if (read2) file2done = !fgets(line2, MAXLINELEN, fp2); /* if one file done, display the rest of the other file */ if (file1done) { if (!file2done && col2) show(fp2, col2, line2); break; } if (file2done) { if (!file1done && col1) show(fp1, col1, line1); break; } /* lines are the same */ - if (!(comp = strcmp(line1, line2))) { + if(iflag) + comp = strcasecmp(line1, line2); + else + comp = strcmp(line1, line2); + + if (!comp) { read1 = read2 = 1; if (col3) (void)printf("%s%s", col3, line1); continue; } /* lines are different */ if (comp < 0) { read1 = 1; read2 = 0; if (col1) (void)printf("%s%s", col1, line1); } else { read1 = 0; read2 = 1; if (col2) (void)printf("%s%s", col2, line2); } } exit(0); } void show(fp, offset, buf) FILE *fp; char *offset, *buf; { do { (void)printf("%s%s", offset, buf); } while (fgets(buf, MAXLINELEN, fp)); } FILE * file(name) char *name; { FILE *fp; if (!strcmp(name, "-")) return (stdin); if ((fp = fopen(name, "r")) == NULL) { err(1, "%s", name); } return (fp); } static void usage() { - (void)fprintf(stderr, "usage: comm [-123] file1 file2\n"); + (void)fprintf(stderr, "usage: comm [-123i] file1 file2\n"); exit(1); } Index: head/usr.bin/uniq/uniq.1 =================================================================== --- head/usr.bin/uniq/uniq.1 (revision 29206) +++ head/usr.bin/uniq/uniq.1 (revision 29207) @@ -1,130 +1,134 @@ .\" Copyright (c) 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" This code is derived from software contributed to Berkeley by .\" the Institute of Electrical and Electronics Engineers, Inc. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" @(#)uniq.1 8.1 (Berkeley) 6/6/93 +.\" From: @(#)uniq.1 8.1 (Berkeley) 6/6/93 +.\" $Id$ .\" .Dd June 6, 1993 .Dt UNIQ 1 .Os .Sh NAME .Nm uniq .Nd report or filter out repeated lines in a file .Sh SYNOPSIS .Nm .Op Fl c | Fl d | Fl u +.Op Fl i .Op Fl f Ar fields .Op Fl s Ar chars .Oo .Ar input_file .Op Ar output_file .Oc .Sh DESCRIPTION The .Nm utility reads the standard input comparing adjacent lines, and writes a copy of each unique input line to the standard output. The second and succeeding copies of identical adjacent input lines are not written. Repeated lines in the input will not be detected if they are not adjacent, so it may be necessary to sort the files first. .Pp The following options are available: .Bl -tag -width Ds .It Fl c 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 Don't output lines that are not repeated in the input. .It Fl f Ar fields Ignore the first .Ar 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 Ignore the first .Ar chars characters in each input line when doing comparisons. If specified in conjunction with the .Fl f option, the first .Ar chars characters after the first .Ar fields fields will be ignored. Character numbers are one based, i.e. the first character is character one. .It Fl u Don't output lines that are repeated in the input. +.It Fl i +Case insensitive comparison of lines. .\".It Fl Ns Ar n .\"(Deprecated; replaced by .\".Fl f ) . .\"Ignore the first n .\"fields on each input line when doing comparisons, .\"where n is a number. .\"A field is a string of non-blank .\"characters separated from adjacent fields .\"by blanks. .\".It Cm \&\(pl Ns Ar n .\"(Deprecated; replaced by .\".Fl s ) . .\"Ignore the first .\".Ar m .\"characters when doing comparisons, where .\".Ar m .\"is a .\"number. .El .Pp If additional arguments are specified on the command line, the first such argument is used as the name of an input file, the second is used as the name of an output file. .Pp The .Nm utility exits 0 on success, and >0 if an error occurs. .Sh COMPATIBILITY The historic .Cm \&\(pl Ns Ar number and .Fl Ns Ar number options have been deprecated but are still supported in this implementation. .Sh SEE ALSO .Xr sort 1 .Sh STANDARDS The .Nm utility is expected to be .St -p1003.2 compatible. Index: head/usr.bin/uniq/uniq.c =================================================================== --- head/usr.bin/uniq/uniq.c (revision 29206) +++ head/usr.bin/uniq/uniq.c (revision 29207) @@ -1,250 +1,259 @@ /* * Copyright (c) 1989, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Case Larsen. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static const char copyright[] = "@(#) Copyright (c) 1989, 1993\n\ The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ #ifndef lint #if 0 static char sccsid[] = "@(#)uniq.c 8.3 (Berkeley) 5/4/95"; #endif static const char rcsid[] = - "$Id$"; + "$Id: uniq.c,v 1.3 1997/08/21 06:51:10 charnier Exp $"; #endif /* not lint */ #include #include #include #include #include #include #define MAXLINELEN (8 * 1024) int cflag, dflag, uflag; int numchars, numfields, repeats; FILE *file __P((char *, char *)); void show __P((FILE *, char *)); char *skip __P((char *)); void obsolete __P((char *[])); static void usage __P((void)); int main (argc, argv) int argc; char *argv[]; { register char *t1, *t2; FILE *ifp, *ofp; int ch; char *prevline, *thisline, *p; + int iflag = 0, comp; obsolete(argv); - while ((ch = getopt(argc, argv, "-cdf:s:u")) != -1) + while ((ch = getopt(argc, argv, "-cdif:s:u")) != -1) switch (ch) { case '-': --optind; goto done; case 'c': cflag = 1; break; case 'd': dflag = 1; break; + case 'i': + iflag = 1; + break; case 'f': numfields = strtol(optarg, &p, 10); if (numfields < 0 || *p) errx(1, "illegal field skip value: %s", optarg); break; case 's': numchars = strtol(optarg, &p, 10); if (numchars < 0 || *p) errx(1, "illegal character skip value: %s", optarg); break; case 'u': uflag = 1; break; case '?': default: usage(); } done: argc -= optind; argv +=optind; /* If no flags are set, default is -d -u. */ if (cflag) { if (dflag || uflag) usage(); } else if (!dflag && !uflag) dflag = uflag = 1; switch(argc) { case 0: ifp = stdin; ofp = stdout; break; case 1: ifp = file(argv[0], "r"); ofp = stdout; break; case 2: ifp = file(argv[0], "r"); ofp = file(argv[1], "w"); break; default: usage(); } prevline = malloc(MAXLINELEN); thisline = malloc(MAXLINELEN); if (prevline == NULL || thisline == NULL) errx(1, "malloc"); if (fgets(prevline, MAXLINELEN, ifp) == NULL) exit(0); while (fgets(thisline, MAXLINELEN, ifp)) { /* If requested get the chosen fields + character offsets. */ if (numfields || numchars) { t1 = skip(thisline); t2 = skip(prevline); } else { t1 = thisline; t2 = prevline; } /* If different, print; set previous to new value. */ - if (strcmp(t1, t2)) { + if (iflag) + comp = strcasecmp(t1, t2); + else + comp = strcmp(t1, t2); + + if (comp) { show(ofp, prevline); t1 = prevline; prevline = thisline; thisline = t1; repeats = 0; } else ++repeats; } show(ofp, prevline); exit(0); } /* * show -- * Output a line depending on the flags and number of repetitions * of the line. */ void show(ofp, str) FILE *ofp; char *str; { if (cflag && *str) (void)fprintf(ofp, "%4d %s", repeats + 1, str); if ((dflag && repeats) || (uflag && !repeats)) (void)fprintf(ofp, "%s", str); } char * skip(str) register char *str; { register int infield, nchars, nfields; for (nfields = numfields, infield = 0; nfields && *str; ++str) if (isspace(*str)) { if (infield) { infield = 0; --nfields; } } else if (!infield) infield = 1; for (nchars = numchars; nchars-- && *str; ++str); return(str); } FILE * file(name, mode) char *name, *mode; { FILE *fp; if ((fp = fopen(name, mode)) == NULL) err(1, "%s", name); return(fp); } void obsolete(argv) char *argv[]; { int len; char *ap, *p, *start; while ((ap = *++argv)) { /* Return if "--" or not an option of any form. */ if (ap[0] != '-') { if (ap[0] != '+') return; } else if (ap[1] == '-') return; if (!isdigit(ap[1])) continue; /* * Digit signifies an old-style option. Malloc space for dash, * new option and argument. */ len = strlen(ap); if ((start = p = malloc(len + 3)) == NULL) errx(1, "malloc"); *p++ = '-'; *p++ = ap[0] == '+' ? 's' : 'f'; (void)strcpy(p, ap + 1); *argv = start; } } static void usage() { (void)fprintf(stderr, - "usage: uniq [-c | -du] [-f fields] [-s chars] [input [output]]\n"); + "usage: uniq [-c | -du | -i] [-f fields] [-s chars] [input [output]]\n"); exit(1); }