我有一个问题,因为我不熟悉 awk。我将 sar -d 输出生成的 csv 文件转换为 csv 样式:
12:33:41 unix,restarts
12:35:00,lofi4096,0,0.0,0,0,0.0,0.0
,iscsi0,0,0.0,0,0,0.0,0.0
,scsi_vhc,0,0.0,0,0,0.0,0.0
,nfs1,0,0.0,0,0,0.0,0.0
12:45:00,lofi4096,0,0.0,0,0,0.0,0.0
,iscsi0,0,0.0,0,0,0.0,0.0
,scsi_vhc,0,0.0,0,0,0.0,0.0
,nfs1,0,0.0,0,0,0.0,0.0
Run Code Online (Sandbox Code Playgroud)
我想转换成这个
12:33:41 unix,restarts
12:35:00,lofi4096,0,0.0,0,0,0.0,0.0
12:35:00,iscsi0,0,0.0,0,0,0.0,0.0
12:35:00,scsi_vhc,0,0.0,0,0,0.0,0.0
12:35:00,nfs1,0,0.0,0,0,0.0,0.0
12:45:00,lofi4096,0,0.0,0,0,0.0,0.0
12:45:00,iscsi0,0,0.0,0,0,0.0,0.0
12:45:00,scsi_vhc,0,0.0,0,0,0.0,0.0
12:45:00,nfs1,0,0.0,0,0,0.0,0.0
Run Code Online (Sandbox Code Playgroud)
我的尝试,但由于 awk 逐行读取,我不知道要保留上一行的值。我希望我所拥有的应该工作。知道如何获得我想要的结果。我尝试过 awk,但我想这应该可以使用 sed 或使用自定义 shell 脚本的困难方式(我试图避免做这部分)。
#!/usr/bin/awk -f
BEGIN {
FS=",";
}
{
print $1
if ($1 != "") {
mydate=$1;
print $0;
}
else {
print $mydate","$0;
}
}
Run Code Online (Sandbox Code Playgroud)
使用 Solaris 11.1 运行系统。
由于输入中似乎有空行,因此它会有点长。以下内容可能对您有用:
awk -F'[, ]' '{if (NF!=0 && $1=="") {$1=prev} prev=$1}1' OFS=, inputfile
Run Code Online (Sandbox Code Playgroud)
这个想法是分割字段,
和空格(后者是为了处理第一行输入)。检查第一个字段是否为空且字段数不为零(处理空行),然后将第一个字段替换为之前存储的第一个字段。
对于您的输入,它会产生:
12:33:41 unix,restarts
12:35:00,lofi4096,0,0.0,0,0,0.0,0.0
12:35:00,iscsi0,0,0.0,0,0,0.0,0.0
12:35:00,scsi_vhc,0,0.0,0,0,0.0,0.0
12:35:00,nfs1,0,0.0,0,0,0.0,0.0
12:45:00,lofi4096,0,0.0,0,0,0.0,0.0
12:45:00,iscsi0,0,0.0,0,0,0.0,0.0
12:45:00,scsi_vhc,0,0.0,0,0,0.0,0.0
12:45:00,nfs1,0,0.0,0,0,0.0,0.0
Run Code Online (Sandbox Code Playgroud)