awk使用printf fmt - 创建xml

时间:2015-12-31 11:24:38

标签: xml awk printf

目的是使用awk生成基于平面文件的XML文件。 我设法通过纯编码来做到这一点。 (打印"等等。 但是我想通过使用printf fmt来获得更多的方法。

输入文件(有更多类似的行) - 我没有提到标题行(标题:地图条目mem)。

Mapone        5        10
Maptwo       12        45 
Maptree       8         7

结果文件应该是:

<Map>Mapone</Map>
   <entries>5</entries>
   <mem>10</mem>   
<Map>Maptwo</Map>
   <entries>12</entries>
   <mem>45</mem>   
<Map>Maptree</Map>
   <entries>8</entries>
   <mem>7</mem>   

目前我使用

BEGIN {FS=" " ;

print "<?xml version=\"1.0\"?>";
}

{  Map = $1; }
{  Entry = $2;}
{  mem = $4;}

{
fmt = fmt "\t<Mapname>%s</Mapname>\n";
fmt = fmt "\t\t<Entries>%s</Entries>\n";
fmt = fmt "\t\t<Mem>%s</Mem>\n";

printf fmt, Map, Entry, mem ;

}

===&GT;此脚本导致包含错误 &#34; awk:printf语句中没有足够的参数&#34;

1 个答案:

答案 0 :(得分:3)

非常简单的改变

你永远不会清除fmt,所以在第一行之后它有太多的参数

BEGIN{
print "<?xml version=\"1.0\"?>";
}

{  Map = $1; }
{  Entry = $2;}
{ mem = $3;  }

{

fmt = "\t<Mapname>%s</Mapname>\n"
#^ this will overwrite the previous fmt, so you won't have too many args.
fmt = fmt "\t\t<Entries>%s</Entries>\n"
fmt = fmt "\t\t<Mem>%s</Mem>\n"

printf fmt, Map, Entry, mem ;

}

上述内容虽然仍然写得非常糟糕,但仍然有效。

我个人会在BEGIN块中设置一次fmt,如下所示

BEGIN{
print "<?xml version=\"1.0\"?>";
fmt = "\t<Mapname>%s</Mapname>\n"
fmt = fmt "\t\t<Entries>%s</Entries>\n"
fmt = fmt "\t\t<Mem>%s</Mem>\n"
}
{
Map = $1
Entry = $2
mem = $3
printf fmt, Map, Entry, mem
}

正如你所看到的,我已经整合了块,因为没有执行它的参数,所以它使(IMO)更清楚,所有这些命令都在每行执行。
我还删除了;,因为除非您没有使用换行符并将内容更改为$3,因为只有3个字段。