我有一个生成的 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 块中。