Fill the empty line by adding line before blank line

FIle A

"A"  2  aa  34
     3  ac
      5  cd 
"B"  3   hu  67
      4  fg
      5  gy  

output shud be

A"" 2  aa  34
 "A"   3   ac 34
 "A"   5  cd 34 
"B"  3   hu  67
"B"   4  fg  67
 "B"  5  gy  67

something like this.

previous_filed.pl

#!/usr/bin/perl

while (<>) {
        if (/(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/) {
                $pr_1=$1;
                $pr_4=$4;
                print $_;
        }
        else
        {
                chomp;
                print $pr_1,$_,"\t",$pr_4,"\n";
        }

}

invocation

perl previous_filed.pl inputfile
1 Like

Hi

#awk 'NF>2{a=$1;b=$4;$1=$1;print;next;}{$1=$1;print a,$0,b;}' file
"A" 2 aa 34
"A" 3 ac 34
"A" 5 cd 34
"B" 3 hu 67
"B" 4 fg 67
"B" 5 gy 67

Guru.

2 Likes

With awk:

awk 'NF==4 {a=$1; b=$4; print; next} {print a, $0, b}' infile
"A"  2  aa  34
"A"      3  ac 34
"A"       5  cd  34
"B"  3   hu  67
"B"       4  fg 67
"B"       5  gy 67

If you want it a bit more properly aligned, you might want to use printf instead of print.

1 Like
my ($a,$b);
while(<DATA>){
  chomp;
  if(/^(".*?").* (\S*)$/){
   $a=$1;
  $b=$2;
  print $_,"\n";
  }
  else{
   print $a," ",$_," ",$b,"\n";
  }
}
__DATA__
"A"  2  aa  34
     3  ac
      5  cd
"B"  3   hu  67
      4  fg
      5  gy
1 Like

Nice.

Another awk aprox:

awk '{if ( /"/){a=$1;b=$NF}else{$0=a""$0" "b}}1' file
1 Like