, 1 min read
Filtering Lines with Specific Length
Original post is here eklausmeier.goip.de/blog/2025/05-25-filtering-lines-with-specific-length.
Task at hand: extract all lines of a file, which do not have a specific line length.
Example: Print out all lines, which do not have a line length of 171 and not 1370.
Also see Line Length Distribution in Files.
Below Perl one-liner does that, here for the line lengths 20 and 21:
perl -ne 'print if (($n=length($_)) != 20 && $n != 21))' <file>
Below C program does it with a little bit of comfort on the command line.
It might also be useful if Perl is not available.
With command line option -g you specify a line length, which should not be filtered.
Multiple line lengths are given by multiple -g's.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MAXBUF	8192
char buf[MAXBUF];
int main (int argc, char *argv[]) {
    int i, c, gcnt=0, len;
    int good[10] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
    FILE *fp;
    while ((c = getopt(argc,argv,"g:")) != -1) {
        switch(c) {
            case 'g':
                if (gcnt >= 9) {
                    printf("%s: too many 'good' lines\n",argv[0]);
                    return 1;
                }
                good[gcnt++] = atoi(optarg);
                break;
            default:
                printf("%s: illegal option %c\n",argv[0],c);
                return 2;
        }
    }
    if (optind < argc) {
        if ((fp = fopen(argv[optind],"r")) == NULL) {
            printf("%s: cannot open %s\n",argv[0],argv[optind]);
            return 3;
        }
    } else fp = stdin;
L1:	while (fgets(buf,MAXBUF,fp) != NULL) {
        len = strlen(buf);
        for (i=0; i<gcnt; ++i)
            if (len == good[i]) goto L1;
        printf("%s",buf);
    }
    return 0;
}
The equivalent of the above Perl command would be
lenfilter -g20 -g21 <file>