diff options
author | Eric Andersen | 2000-12-09 16:37:53 +0000 |
---|---|---|
committer | Eric Andersen | 2000-12-09 16:37:53 +0000 |
commit | 5b5db38a7df20c8196e6a737cb2c76b219e152cc (patch) | |
tree | dcf75d601711f5c3b7ccf036ba80b7fcc71fc338 | |
parent | 1bca5ed886322f49fddd4b05ca76fd3a1906d98b (diff) | |
download | busybox-5b5db38a7df20c8196e6a737cb2c76b219e152cc.zip busybox-5b5db38a7df20c8196e6a737cb2c76b219e152cc.tar.gz |
Patch from Matt Kraai to implement uniq -[cdu]
-rw-r--r-- | applets/usage.c | 4 | ||||
-rw-r--r-- | coreutils/uniq.c | 45 | ||||
-rw-r--r-- | docs/busybox.pod | 8 | ||||
-rw-r--r-- | docs/busybox.sgml | 12 | ||||
-rw-r--r-- | uniq.c | 45 | ||||
-rw-r--r-- | usage.c | 4 |
6 files changed, 103 insertions, 15 deletions
diff --git a/applets/usage.c b/applets/usage.c index 75c421a..ae6cec8 100644 --- a/applets/usage.c +++ b/applets/usage.c @@ -1365,6 +1365,10 @@ const char uniq_usage[] = #ifndef BB_FEATURE_TRIVIAL_HELP "\nDiscard all but one of successive identical lines from INPUT\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 diff --git a/coreutils/uniq.c b/coreutils/uniq.c index cfe6cca..c0229ae 100644 --- a/coreutils/uniq.c +++ b/coreutils/uniq.c @@ -28,28 +28,59 @@ #include <string.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) { FILE *in = stdin, *out = stdout; char *lastline = NULL, *input; + int opt, count = 0; /* parse argv[] */ - if ((argc > 1 && **(argv + 1) == '-') || argc > 3) - usage(uniq_usage); + while ((opt = getopt(argc, argv, "cdu")) > 0) { + 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) { - in = xfopen(argv[1], "r"); - if (argv[2] != NULL) - out = xfopen(argv[2], "w"); + if (argv[optind] != NULL) { + in = xfopen(argv[optind], "r"); + if (argv[optind+1] != NULL) + out = xfopen(argv[optind+1], "w"); } while ((input = get_line_from_file(in)) != NULL) { if (lastline == NULL || strcmp(input, lastline) != 0) { - fputs(input, out); + print_line(lastline, count, out); free(lastline); lastline = input; + count = 0; } + count++; } + print_line(lastline, count, out); free(lastline); return EXIT_SUCCESS; diff --git a/docs/busybox.pod b/docs/busybox.pod index 2ddacd1..5e47984 100644 --- a/docs/busybox.pod +++ b/docs/busybox.pod @@ -1954,6 +1954,12 @@ Usage: uniq [OPTION]... [INPUT [OUTPUT]] Discard all but one of successive identical lines from INPUT (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: @@ -2286,4 +2292,4 @@ Enrique Zanardi <ezanardi@ull.es> =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 $ diff --git a/docs/busybox.sgml b/docs/busybox.sgml index 1848141..7d86e19 100644 --- a/docs/busybox.sgml +++ b/docs/busybox.sgml @@ -3428,6 +3428,18 @@ </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> Example: </para> @@ -28,28 +28,59 @@ #include <string.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) { FILE *in = stdin, *out = stdout; char *lastline = NULL, *input; + int opt, count = 0; /* parse argv[] */ - if ((argc > 1 && **(argv + 1) == '-') || argc > 3) - usage(uniq_usage); + while ((opt = getopt(argc, argv, "cdu")) > 0) { + 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) { - in = xfopen(argv[1], "r"); - if (argv[2] != NULL) - out = xfopen(argv[2], "w"); + if (argv[optind] != NULL) { + in = xfopen(argv[optind], "r"); + if (argv[optind+1] != NULL) + out = xfopen(argv[optind+1], "w"); } while ((input = get_line_from_file(in)) != NULL) { if (lastline == NULL || strcmp(input, lastline) != 0) { - fputs(input, out); + print_line(lastline, count, out); free(lastline); lastline = input; + count = 0; } + count++; } + print_line(lastline, count, out); free(lastline); return EXIT_SUCCESS; @@ -1365,6 +1365,10 @@ const char uniq_usage[] = #ifndef BB_FEATURE_TRIVIAL_HELP "\nDiscard all but one of successive identical lines from INPUT\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 |