xml - awk 使用 printf fmt - 创建 xml

标签 xml awk printf

目的是使用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/

相关文章:

c - 在 printf 语句 C 的开头填充零

Android Studio xml 未将 png 转换为可绘制对象

asp.net - 使用 Xpath 检索元素的文本内容

linux - 通过管道传输到 awk 的 Bash 命令有时会被缓冲

datetime - 在 AWK 中转换日期

c++ - 如何在cpp和c中不使用cout/printf输出文本?

c - 两个格式说明符但只有一个参数

sql-server - VBS第三方程序(如SQL)中的错误处理

java - 在Java中向大量XML文件的开头添加属性的最有效方法?

bash - 将 C 头文件中的#defines 转换为 bash 变量