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
"\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

View File

@ -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;

View File

@ -1955,6 +1955,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:
$ echo -e "a\na\nb\nc\nc\na" | sort | uniq
@ -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 $

View File

@ -3427,6 +3427,18 @@
INPUT (or stdin), writing to OUTPUT (or stdout).
</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>

45
uniq.c
View File

@ -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;

View File

@ -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