Sed/awk to delete single lines that aren't touching other lines

Hello,

I'm trying to figure out how to use sed or awk to delete single lines in a file. By single, I mean lines that are not touching any other lines (just one line with white space above and below).

Example:

one
two

three
four

five

six
seven

eight

I want it to look like:

one
two

three
four

six
seven

Where "five" and "eight" were deleted because they were single lines. Any ideas?

Try this...

tr '\n' '-' < input_file | sed 's/--[^-]*--/--/g;s/-/\n/g'

#or

awk '/^$/{getline x;getline y;if(!y){next}else{print x"\n"y}}1' input_file

Results may vary. If it doesn't work, post a bigger sample.

--ahamed

I don't believe that ahamed's awk will handle two 'singles' in a row. If that's never the case, then no biggie, but for data like this:

one
two

three
four

five

six
seven

eight

nine
ten 
eleven
twelve

thirteen lone

fourteen lone

fifteen
sixteen

I'd suggest:

awk '
    NF == 0 {
        if( count >1 )
            printf( "%s\n",  buffer );

        count = 0;
        buffer = "";
        next;
    }

    {
        buffer = buffer $0 "\n";
        count++;
    }
' input-file

Which yields:

one
two

three
four

six
seven

nine
ten 
eleven
twelve

fifteen
sixteen
1 Like

Yes agama, you are right. I figured that out, thats why I put a disclaimer "Results may vary..." :wink:

--ahamed

1 Like

Works perfectly. Thank you both!

That will teach me to look at everything -- not just the code :slight_smile:

As always, nice to see your approach.

You can also give a try to this much more simple one:

nawk 'NF>1' RS="" FS="\n" ORS="\n\n" yourfile

or

nawk 'BEGIN {RS="";FS="\n"}NF>1' ORS="\n\n" yourfile
$ cat f
one
two

three
four

five

six
seven

eight

nine
ten 
eleven
twelve

thirteen lone

fourteen lone

fifteen
sixteen
$ nawk 'NF>1' RS="" FS="\n" ORS="\n\n" f
one
two

three
four

six
seven

nine
ten 
eleven
twelve

fifteen
sixteen

$