summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen2000-12-09 16:37:53 +0000
committerEric Andersen2000-12-09 16:37:53 +0000
commit5b5db38a7df20c8196e6a737cb2c76b219e152cc (patch)
treedcf75d601711f5c3b7ccf036ba80b7fcc71fc338
parent1bca5ed886322f49fddd4b05ca76fd3a1906d98b (diff)
downloadbusybox-5b5db38a7df20c8196e6a737cb2c76b219e152cc.zip
busybox-5b5db38a7df20c8196e6a737cb2c76b219e152cc.tar.gz
Patch from Matt Kraai to implement uniq -[cdu]
-rw-r--r--applets/usage.c4
-rw-r--r--coreutils/uniq.c45
-rw-r--r--docs/busybox.pod8
-rw-r--r--docs/busybox.sgml12
-rw-r--r--uniq.c45
-rw-r--r--usage.c4
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>
diff --git a/uniq.c b/uniq.c
index cfe6cca..c0229ae 100644
--- a/uniq.c
+++ b/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/usage.c b/usage.c
index 75c421a..ae6cec8 100644
--- a/usage.c
+++ b/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