繁体   English   中英

如何将 header 添加到 awk output?

[英]How to add a header to awk output?

我有一个 csv 文件,如下所示

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

我想检索第一、第二和第四列值(不带引号)并以以下格式填充到另一个 csv 中。

IP          DEVICETYPE  DEVICENAME
10.8.70.67  wireless    UTY_07_ISD
10.8.70.69  wireless    RGB_34_FTR

我使用了下面的 awk 命令

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

并得到以下 output

10.8.70.67  wireless    UTY_07_ISD
10.8.70.69  wireless    RGB_34_FTR

请帮助为每一列分配标题。

假设您在引用的字符串中没有逗号或双引号(一个很大的假设!)它可以很简单

$ 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

使用您显示的示例,您能否尝试以下操作。 在 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

说明:为上述添加详细说明。

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.

一个简单的 oneliner 将是:

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

在这里,我使用了 BEGIN/END 特殊模式,用于执行一些启动或清理操作,以添加标题。 有关更多详细信息,请参阅使用 BEGIN/END的文档

我使用以下命令得到了预期的 output

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

我发现我缺少 BEGIN 部分。 谢谢大家的回复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM