// // mjdskip - delete lines in file based on MJD range. // // 06-Mar-2008 tvb // #include #include #include #include #define MAX 100 struct _pair { double from, to; } mjdlist[MAX]; int mjdcmp (const struct _pair *a, const struct _pair *b) { if (a->from < b->from) return -1; if (a->from > b->from) return 1; return 0; } void main (int argc, char *argv[]) { long In, Out; int i, n, verbose; char line[1000], *p; double from, to; // Option to show deleted lines. verbose = 0; if (argc > 1 && strcmp(argv[1], "/v") == 0) { verbose = 1; argc -= 1; argv += 1; } // Collect MJD date ranges. i = 0; while (argc > 1) { if (i == MAX) { fprintf(stderr, "Too many MJD\n"); exit(1); } p = strstr(argv[1], "-"); if (p) { *p = '\0'; from = atof(argv[1]); to = atof(p + 1); // Excuse out of order ranges. if (mjdlist[i].from > mjdlist[i].to) { double t = from; from = to; to = t; } } else { from = to = atof(argv[1]); } mjdlist[i].from = from; mjdlist[i].to = to; argc -= 1; argv += 1; i += 1; } n = i; // Sort MJD list. qsort(mjdlist, n, sizeof mjdlist[0], mjdcmp); // Echo sorted MJD list. fprintf(stderr, "Skipping %d lines with MJD", n); for (i = 0; i < n; i += 1) { if (mjdlist[i].from == mjdlist[i].to) { fprintf(stderr, " %g", mjdlist[i].from); } else { fprintf(stderr, " %g-%g", mjdlist[i].from, mjdlist[i].to); } } fprintf(stderr, "\n"); // Filter input file deleting lines within range. i = In = Out = 0; while (fgets(line, sizeof(line), stdin) != NULL) { double mjd; In += 1; mjd = atof(line); while (i < n && mjd > mjdlist[i].to) { i += 1; } if (i == n || mjd < mjdlist[i].from) { fputs(line, stdout); Out += 1; } else { if (verbose) { fprintf(stderr, "skip: %s", line); } } } // Display line count summary. fprintf(stderr, "%ld lines in, %ld lines skipped, %ld lines out\n", In, In - Out, Out); }