user3270725
user3270725

Reputation: 133

Insert new line if different number appears in a column

I have a column

1
1
1
2
2
2

I would like to insert a blank line when the value in the column changes:

1
1
1
                <- blank line
2
2
2

Upvotes: 7

Views: 2188

Answers (5)

John B
John B

Reputation: 3646

You could use getline function in Awk to match the current line against the following line:

awk '{f=$1; print; getline}f != $1{print ""}1' file

Upvotes: 0

halfbit
halfbit

Reputation: 3464

You can also do this with SED:

sed '{N;s/^\(.*\)\n\1$/\1\n\1/;tx;P;s/^.*\n/\n/;P;D;:x;P;D}'

The long version with explanations is:

sed '{
N   # read second line; (terminate if there are no more lines)
s/^\(.*\)\n\1$/\1\n\1/ # try to replace two identical lines with themselves
tx  # if replacement succeeded then goto label x
P   # print the first line
s/^.*\n/\n/ # replace first line by empty line
P   # print this empty line
D   # delete empty line and proceed with input
:x  # label x
P   # print first line
D   # delete first line and proceed with input
}'

One thing I like about using (GNU) SED (what which is not clear if it is useful to you from your question) is that you can easily apply changes in-place with the -i switch, e.g.

sed -i '{N;s/^\(.*\)\n\1$/\1\n\1/;tx;P;s/^.*\n/\n/;P;D;:x;P;D}' FILE

Upvotes: 0

Tom Fenech
Tom Fenech

Reputation: 74625

I would recommend using awk:

awk -v i=1 'NR>1 && $i!=p { print "" }{ p=$i } 1' file

On any line after the first, if value of the "i"th column is different to the previous value, print a blank line. Always set the value of p. The 1 at the end evaluates to true, which means that awk prints the line. i can be set to the column number of your choice.

Upvotes: 7

Chris Dodd
Chris Dodd

Reputation: 126223

awk(1) seems like the obvious answer to this problem:

#!/usr/bin/awk -f
BEGIN { prev = "" }
/./ {
    if (prev != "" && prev != $1) print ""
    print
    prev = $1
}

Upvotes: 1

Cyrus
Cyrus

Reputation: 88646

while read L; do [[ "$L" != "$PL" && "$PL" != "" ]] && echo; echo "$L"; PL="$L"; done < file

Upvotes: 1

Related Questions