selvan venkatesh
selvan venkatesh

Reputation: 55

How to add a header to awk output?

I have a csv file that looks like below

"10.8.70.67","wireless",,"UTY_07_ISD",,26579
"10.8.70.69","wireless",,"RGB_34_FTR",,19780

I want to retrieve first, second and fourth column values (without quotes) and populate into a another csv in the below format.

IP          DEVICETYPE  DEVICENAME
10.8.70.67  wireless    UTY_07_ISD
10.8.70.69  wireless    RGB_34_FTR

I have used the below awk command

awk -F ',|,,' '{gsub(/"/,"",$1); gsub(/"/,"",$2); gsub(/"/,"",$3); print $1, $2, $3}' file.csv

and got the below output

10.8.70.67  wireless    UTY_07_ISD
10.8.70.69  wireless    RGB_34_FTR

please help in assigning headings to each column.

Upvotes: 3

Views: 4732

Answers (4)

RavinderSingh13
RavinderSingh13

Reputation: 133508

With your shown samples, could you please try following. Written and tested in GNU awk.

awk -v FPAT='([^,]*)|("[^"]+")' '
BEGIN{
  OFS=","
  print "IP          DEVICETYPE  DEVICENAME"
}
function remove(fields){
  num=split(fields,arr,",")
  for(i=1;i<=num;i++){
    gsub(/^"|"$/,"",$arr[i])
  }
}
{
  remove("1,2,4")
  print $1,$2,$4
}
' Input_file

Explanation: Adding detailed explanation for above.

awk -v FPAT='([^,]*)|("[^"]+")' '    ##Setting FPAT to get only matched fields only as ([^,]*)|("[^"]+") as per samples.
BEGIN{                               ##Starting BEGIN section of this program from here.
  print "IP          DEVICETYPE  DEVICENAME" ##printing header here.
}
function remove(fields){             ##Creating function named remove here where we are passing field numbers from where we need to remove "
  num=split(fields,arr,",")          ##Splitting fields into arr here.
  for(i=1;i<=num;i++){               ##Traversing through all items of arr here.
    gsub(/^"|"$/,"",$arr[i])         ##Globally substituting starting and ending " in mentioned fields with NULL here.
  }
}
{
  remove("1,2,4")                    ##Calling remove here with field numbers of 1,2 and 4 which we need as per output.
  print $1,$2,$4                     ##Printing 1st, 2nd and 4th field here.
}
' Input_file                         ##Mentioning Input_file name here.

Upvotes: 1

selvan venkatesh
selvan venkatesh

Reputation: 55

I got the expected output with the below command

awk -F ',|,,' 'BEGIN {print "IP,DEVICETYPE,DEVICENAME"} {gsub(/"/, "", $1); gsub(/"/, "", $2); gsub(/"/, "", $3); print $1","$2","$3}' input.csv > output.csv

I found that I was missing BEGIN part. Thanks all for your response.

Upvotes: -2

karakfa
karakfa

Reputation: 67497

assuming you don't have comma or double quotes in the quoted strings (a big assumption!) it can be as simple as

$ awk -F, 'NR==1 {print "IP","DEVICETYPE","DEVICENAME"} 
                 {gsub(/"/,""); 
                  print $1,$2,$4}' file | column -t

IP          DEVICETYPE  DEVICENAME
10.8.70.67  wireless    UTY_07_ISD
10.8.70.69  wireless    RGB_34_FTR

Upvotes: 7

masterop
masterop

Reputation: 184

A simple oneliner will be:

awk -F ',|,,' 'BEGIN {format = "%-20s %-20s %-20s\n"; printf format, "IP", "DEVICETYPE", "DEVICENAME"} {gsub(/"/,"",$1); gsub(/"/,"",$2); gsub(/"/,"",$3); printf format, $1, $2, $3}' abc.csv

Here I have used BEGIN/END special pattern, which is used to do some startup or cleanup actionn, to add headings. For more details please refer to the documentation Using BEGIN/END

Upvotes: 0

Related Questions