在solaris上用gawk解析csv的几个字段

在solaris上用gawk解析csv的几个字段

我有一个生成的 csv,其格式如下:

unixtime;host_name;ip_adress;description;2;0;1

我一直在尝试解析此 csv 以执行以下操作:

将字段 1 从 unix 时间戳更改为人类可读的。

将字段 5 从 2 更改为关键

像这样更改字段 6 和 7:

如果值为 0 则替换为 NO,如果为 1 则替换为 yes

我已经成功地用这个完成了前两个:

cat test.csv |
  /opt/csw/bin/gawk -F";" '{OFS=";"; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' |
  /opt/csw/bin/gawk -F";" '{OFS=";"; gsub("2", "CRITICAL", $5)}1'

但是如何在 $6 和 $7 字段中将 1 更改为 yes,将 0 更改为 no?

如果我尝试这样的操作,它会替换所有找到 0 的地方:

gawk 'BEGIN {OFS=FS=";"} {if ($6== "0") gsub ($6,"NO"); print }' sample.csv

根据记录,我使用的是 Solaris,并从 opencsw 安装了 gawk。

答案1

以下gawk程序应该适合您:

echo -e "unixtime;host_name;ip_adress;description;2;0;1\n1234567890;hName;hIP;hDesc;2;1;0" |
gawk -F";" 'BEGIN {OFS=";"} {
  if (NR<2) next;
  $1=strftime("%Y-%m-%d %H:%M:%S", $1);
  $5=($5==2?"CRITICAL":$5);
  $6=($6?"Yes":"No") ; $7=($7?"Yes":"No") ;
  print}'

2009-02-14 00:31:30;hName;hIP;hDesc;CRITICAL;Yes;No

这里最重要的是,您可以在一次awk调用中放入多个命令。

$6=($6?"Yes":"No")或者,更正式地(condition?consequence:alternative)称为“三元”运算符,它是if (condition) consequence else alternative

如果你想打印标题行不变,不是“跳过它”,你可以写if (NR<2) {print;next} ;

编辑:实现了 @cas 的性能改进提示,将 OFS 分配移动到 BEGIN 块中。

相关内容