目的是使用awk基于平面文件生成XML文件。 我设法通过纯编码来做到这一点。 (打印“..等。 但我想要通过使用 printf fmt 来实现更 awk 的方式。
输入文件(还有更多类似的行)-我没有提到标题行(标题: map 条目内存)。
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 ;
}
===> 该脚本导致错误包含 “awk:printf 语句中没有足够的参数”
最佳答案
非常简单的改变
你永远不会清除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 block 中设置一次 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
}
正如您所看到的,我还合并了该 block ,因为没有执行它的参数,因此它使(IMO)更清楚,所有这些命令都在每一行执行。
我还删除了它们 ;
因为它们不是必需的,除非您不使用换行符,并将 mem 更改为 $3
因为只有 3 个字段。
关于xml - awk 使用 printf fmt - 创建 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34545763/