A.K
A.K

Reputation: 98

Formatting output using awk

I've a file with following content:

A 28713.64                  27736.1000
B 9835.32
C 38548.96

Now, i need to check if the last row in the first column is 'C', then the value of first row in third column should be printed in the third column against 'C'.

Expected Output:

A 28713.64                  27736.1000
B 9835.32
C 38548.96                  27736.1000

I tried below, but it's not working:

awk '{if ($1 == "C") ; print $1,$2,$3}' file_name

Any help is most welcome!!!

Upvotes: 1

Views: 915

Answers (3)

ghoti
ghoti

Reputation: 46826

POSIX dictates that "assigning to a nonexistent field (for example, $(NF+2)=5) shall increase the value of NF; create any intervening fields with the uninitialized value; and cause the value of $0 to be recomputed, with the fields being separated by the value of OFS."

So...

awk 'NR==1{x=$3} $1=="C"{$3=x} 1' input.txt

Note that the output is not formatted well, but that's likely the case with most of the solutions here. You could pipe the output through column, as Ravinder suggested. Or you could control things precisely by printing your data with printf.

awk 'NR==1{x=$3} $1=="C"{$3=x} {printf "%-2s%-26s%s\n",$1,$2,$3}' input.txt

If your lines can be expressed in a printf format, you'll be able to avoid the unpredictability of column -t and save the overhead of a pipe.

Upvotes: 2

RavinderSingh13
RavinderSingh13

Reputation: 133458

EDIT: As per OP's comment OP is looking for very first line and looking to match C string at very last line of Input_file, if this is the case then one should try following.

awk '
FNR==1{
  value=$NF
  print
  next
}
prev{
  print prev
}
{
  prev=$0
  prev_first=$1
}
END{
  if(prev_first=="C"){
      print prev,value
  }
  else{
      print
  }
}'  file | column -t


Assuming that your actual Input_file is same as shown samples and you want to pick value from 1st column whose value is A.

awk '$1=="A" && FNR==1{value=$NF} $1=="C"{print $0,value;next} 1' Input_file| column -t

Output will be as follows.

A  28713.64  27736.1000
B  9835.32
C  38548.96  27736.1000

Upvotes: 2

Kent
Kent

Reputation: 195039

This works for the given example:

awk 'NR==1{v=$3}$1=="C"{$0=$0 FS v}7' file|column -t

If you want to append the 3rd column value from A row to C row, change NR==1 into $1=="A"

The column -t part is just for making output pretty. :-)

Upvotes: 2

Related Questions