Patch from Matt Kraai to implement uniq -[cdu]

This commit is contained in:
Eric Andersen 2000-12-09 16:37:53 +00:00
parent 1bca5ed886
commit 5b5db38a7d
6 changed files with 103 additions and 15 deletions

View File

@ -1365,6 +1365,10 @@ const char uniq_usage[] =
#ifndef BB_FEATURE_TRIVIAL_HELP #ifndef BB_FEATURE_TRIVIAL_HELP
"\nDiscard all but one of successive identical lines from INPUT\n" "\nDiscard all but one of successive identical lines from INPUT\n"
"(or standard input), writing to OUTPUT (or standard output).\n" "(or standard input), writing to OUTPUT (or standard output).\n"
"Options:\n"
"\t-c\tprefix lines by the number of occurrences\n"
"\t-d\tonly print duplicate lines\n"
"\t-u\tonly print unique lines\n"
#endif #endif
; ;
#endif #endif

View File

@ -28,28 +28,59 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
static int print_count;
static int print_uniq = 1;
static int print_duplicates = 1;
static void print_line(char *line, int count, FILE *fp)
{
if ((print_duplicates && count > 1) || (print_uniq && count == 1)) {
if (print_count)
fprintf(fp, "%7d\t%s", count, line);
else
fputs(line, fp);
}
}
int uniq_main(int argc, char **argv) int uniq_main(int argc, char **argv)
{ {
FILE *in = stdin, *out = stdout; FILE *in = stdin, *out = stdout;
char *lastline = NULL, *input; char *lastline = NULL, *input;
int opt, count = 0;
/* parse argv[] */ /* parse argv[] */
if ((argc > 1 && **(argv + 1) == '-') || argc > 3) while ((opt = getopt(argc, argv, "cdu")) > 0) {
usage(uniq_usage); switch (opt) {
case 'c':
print_count = 1;
break;
case 'd':
print_duplicates = 1;
print_uniq = 0;
break;
case 'u':
print_duplicates = 0;
print_uniq = 1;
break;
}
}
if (argv[1] != NULL) { if (argv[optind] != NULL) {
in = xfopen(argv[1], "r"); in = xfopen(argv[optind], "r");
if (argv[2] != NULL) if (argv[optind+1] != NULL)
out = xfopen(argv[2], "w"); out = xfopen(argv[optind+1], "w");
} }
while ((input = get_line_from_file(in)) != NULL) { while ((input = get_line_from_file(in)) != NULL) {
if (lastline == NULL || strcmp(input, lastline) != 0) { if (lastline == NULL || strcmp(input, lastline) != 0) {
fputs(input, out); print_line(lastline, count, out);
free(lastline); free(lastline);
lastline = input; lastline = input;
count = 0;
} }
count++;
} }
print_line(lastline, count, out);
free(lastline); free(lastline);
return EXIT_SUCCESS; return EXIT_SUCCESS;

View File

@ -1954,6 +1954,12 @@ Usage: uniq [OPTION]... [INPUT [OUTPUT]]
Discard all but one of successive identical lines from INPUT Discard all but one of successive identical lines from INPUT
(or standard input), writing to OUTPUT (or standard output). (or standard input), writing to OUTPUT (or standard output).
Options:
-c prefix lines by the number of occurrences
-d only print duplicate lines
-u only print unique lines
Example: Example:
@ -2286,4 +2292,4 @@ Enrique Zanardi <ezanardi@ull.es>
=cut =cut
# $Id: busybox.pod,v 1.79 2000/12/08 20:38:00 andersen Exp $ # $Id: busybox.pod,v 1.80 2000/12/09 16:37:53 andersen Exp $

View File

@ -3427,6 +3427,18 @@
INPUT (or stdin), writing to OUTPUT (or stdout). INPUT (or stdin), writing to OUTPUT (or stdout).
</para> </para>
<para>
Options:
</para>
<para>
<screen>
-c prefix lines by the number of occurrences
-d only print duplicate lines
-u only print unique lines
</screen>
</para>
<para> <para>
Example: Example:
</para> </para>

45
uniq.c
View File

@ -28,28 +28,59 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
static int print_count;
static int print_uniq = 1;
static int print_duplicates = 1;
static void print_line(char *line, int count, FILE *fp)
{
if ((print_duplicates && count > 1) || (print_uniq && count == 1)) {
if (print_count)
fprintf(fp, "%7d\t%s", count, line);
else
fputs(line, fp);
}
}
int uniq_main(int argc, char **argv) int uniq_main(int argc, char **argv)
{ {
FILE *in = stdin, *out = stdout; FILE *in = stdin, *out = stdout;
char *lastline = NULL, *input; char *lastline = NULL, *input;
int opt, count = 0;
/* parse argv[] */ /* parse argv[] */
if ((argc > 1 && **(argv + 1) == '-') || argc > 3) while ((opt = getopt(argc, argv, "cdu")) > 0) {
usage(uniq_usage); switch (opt) {
case 'c':
print_count = 1;
break;
case 'd':
print_duplicates = 1;
print_uniq = 0;
break;
case 'u':
print_duplicates = 0;
print_uniq = 1;
break;
}
}
if (argv[1] != NULL) { if (argv[optind] != NULL) {
in = xfopen(argv[1], "r"); in = xfopen(argv[optind], "r");
if (argv[2] != NULL) if (argv[optind+1] != NULL)
out = xfopen(argv[2], "w"); out = xfopen(argv[optind+1], "w");
} }
while ((input = get_line_from_file(in)) != NULL) { while ((input = get_line_from_file(in)) != NULL) {
if (lastline == NULL || strcmp(input, lastline) != 0) { if (lastline == NULL || strcmp(input, lastline) != 0) {
fputs(input, out); print_line(lastline, count, out);
free(lastline); free(lastline);
lastline = input; lastline = input;
count = 0;
} }
count++;
} }
print_line(lastline, count, out);
free(lastline); free(lastline);
return EXIT_SUCCESS; return EXIT_SUCCESS;

View File

@ -1365,6 +1365,10 @@ const char uniq_usage[] =
#ifndef BB_FEATURE_TRIVIAL_HELP #ifndef BB_FEATURE_TRIVIAL_HELP
"\nDiscard all but one of successive identical lines from INPUT\n" "\nDiscard all but one of successive identical lines from INPUT\n"
"(or standard input), writing to OUTPUT (or standard output).\n" "(or standard input), writing to OUTPUT (or standard output).\n"
"Options:\n"
"\t-c\tprefix lines by the number of occurrences\n"
"\t-d\tonly print duplicate lines\n"
"\t-u\tonly print unique lines\n"
#endif #endif
; ;
#endif #endif