// // Simple filter to pass the first of every N input lines. // #include #include #include long Skip = 0; long Take = 0; long Window = 1; void main (int argc, char *argv[]) { long In; long Index; char Line[1000]; long Out; if (argc > 1 && strcmp(argv[1], "/?") == 0) { fprintf(stderr, "%s [Window] [Skip] [Take]\n", argv[0]); exit(0); } if (argc > 1) { sscanf(argv[1], "%ld", &Window); if (Window < 1) { Window = 1; } fprintf(stderr, "Window %ld\n", Window); } if (argc > 2) { sscanf(argv[2], "%ld", &Skip); if (Skip < 0) { Skip = 0; } fprintf(stderr, "Skip %ld\n", Skip); } if (argc > 3) { sscanf(argv[3], "%ld", &Take); if (Take < 1) { Take = 1; } fprintf(stderr, "Take %ld\n", Take); } In = Out = Index = 0; while (fgets(Line, sizeof(Line), stdin) != NULL) { In += 1; if (In > Skip) { if (Index == 0) { fputs(Line, stdout); Out += 1; if (Take != 0 && Out == Take) { break; } } Index = (Index + 1) % Window; } } fprintf(stderr, "%ld lines in", In); if (Skip != 0) { fprintf(stderr, ", %ld lines skipped", Skip); } fprintf(stderr, ", %ld lines out", Out); if (Index != 0 && Take == 0) { fprintf(stderr, ", %ld lines left", Index); } fprintf(stderr, "\n"); return; }