mirror of
https://github.com/sheumann/hush.git
synced 2024-11-19 08:31:11 +00:00
Patch from Matt Kraai to implement uniq -[cdu]
This commit is contained in:
parent
1bca5ed886
commit
5b5db38a7d
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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 $
|
||||||
|
@ -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
45
uniq.c
@ -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;
|
||||||
|
4
usage.c
4
usage.c
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user