【问题标题】:awk using printf fmt - create xmlawk 使用 printf fmt - 创建 xml
【发布时间】:2016-04-05 09:16:39
【问题描述】:

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

输入文件(有更多类似的行) - 我没有提到标题行(标题:映射条目内存)。

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 语句中没有足够的参数"

【问题讨论】:

  • 您的printf 语句应该类似于printf "%s %s %s %s", fmt, Map, Entry, mem ;。你错过了。
  • 你永远不会清除 fmt,所以在第一行之后它有太多的参数。要么清除它,要么在 END 语句中打印一次
  • @fedorqui 这也会失败,因为他们使用fmt 作为格式,所以在你的例子中不需要第一位
  • @123 哦,对,你是对的。我不知道可以给printf 加上所有占位符的字符串。

标签: xml awk printf


【解决方案1】:

很简单的改变

你永远不会清除 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) 更清楚的是,所有这些命令都在每一行执行。
我还删除了它们 ;,因为它们不是必需的,除非您不使用换行符并将 mem 更改为 $3,因为只有 3 个字段。

【讨论】:

  • 一个简单的printf fmt, $1, $2, $3 将同样清晰。根本不需要变量。
猜你喜欢
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 2011-04-13
  • 2019-12-24
  • 2022-01-14
相关资源
最近更新 更多