jcrshankar
jcrshankar

Reputation: 1196

How to replace the empty place with next line content in shell script

1,n1,abcd,1234 
2,n2,abrt,5666
 ,h2,yyyy,123x
3,h2,yyyy,123y
3,h2,yyyy,1234
 ,k1,yyyy,5234
4,22,yyyy,5234

the above given is my input file abc.txt , all I want the missing first column value should fill with next row first value. example:

3,h2,yyyy,123x
3,h2,yyyy,123y

I want output like below,

1,n1,abcd,1234
2,n2,abrt,5666
3,h2,yyyy,123x// the missing first column value 3 should fill with second row first value
3,h2,yyyy,123y
3,h2,yyyy,1234
4,k1,yyyy,5234
4,22,yyyy,5234

How to implement this with help of AWK or some other alternate in shell script,please help.

Upvotes: 1

Views: 53

Answers (3)

Benjamin W.
Benjamin W.

Reputation: 52291

With GNU sed:

$ sed '/^ ,/{N;s/ \(.*\n\)\([^,]*\)\(.*\)/\2\1\2\3/}' infile
1,n1,abcd,1234 
2,n2,abrt,5666
3,h2,yyyy,123x
3,h2,yyyy,123y
3,h2,yyyy,1234
4,k1,yyyy,5234
4,22,yyyy,5234

The sed command does the following:

/^ ,/ {   # If the line starts with 'space comma'
    N     # Append the next line

    # Extract the value before the comma, prepend to first line
    s/ \(.*\n\)\([^,]*\)\(.*\)/\2\1\2\3/
}

BSD sed would require an extra semicolon before the closing brace.

This only works with non-contiguous lines with missing values.

Upvotes: 0

anubhava
anubhava

Reputation: 785481

Using awk you can do:

awk -F, '$1 ~ /^ *$/ {
   p=p RS $0
   next
}
p!="" {
   gsub(RS " +", RS $1, p)
   sub("^" RS, "", p)
   print p
   p=""
} 1' file

1,n1,abcd,1234
2,n2,abrt,5666
3,h2,yyyy,123x
3,h2,yyyy,123y
3,h2,yyyy,1234
4,k1,yyyy,5234
4,22,yyyy,5234

Upvotes: 1

glenn jackman
glenn jackman

Reputation: 247012

I would reverse the file, and then replace the value from the previous line:

tac filename | awk -F, '$1 ~ /^[[:blank:]]*$/ {$1 = prev} {print; prev=$1}' | tac

This will also fill in missing values on multiple lines.

Upvotes: 1

Related Questions