这是一个可执行的 awk 脚本示例,我在其中创建了几个帮助函数来重用代码:
#!/usr/bin/awk -f
BEGIN {
FS=";"
documentEnclosingTag = "rows"
c_flds["name"]; c_flds["num_comd"]; c_flds["num_tel"]
d_flds["name"]; d_flds["id_client"]; d_flds["num_fixe"]
x_flds["name"]
z_flds["name"]
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
printf "<%s>\n", documentEnclosingTag
}
FNR==1 { gsub(" ", ""); for(i=1; i<=NF; i++) cols[$i]=i; next }
$(cols["id_client"]) ~ /C$/ { print createObject( "C", c_flds ) }
$(cols["id_client"]) ~ /D$/ { print createObject( "D", d_flds ) }
$(cols["id_client"]) ~ /X$/ { print createObject( "X", x_flds ) }
$(cols["id_client"]) ~ /Z$/ { print createObject( "Z", z_flds ) }
END { printf "</%s>\n", documentEnclosingTag }
#----------- functions -----------
function createObject( enclosingTag, flds, key, s) {
for(key in flds) {
s = s "\t" wrapData( key, $(cols[key]) ) "\n"
}
return( wrapData( enclosingTag, "\n" s ) )
}
function wrapData( enclosingTag, data ) {
return( sprintf( "<%s>%s</%s>", enclosingTag, data, enclosingTag ) )
}
你可以把它放在一个文件中(script.awk),让它可执行,然后像这样运行它
./script.awk data > data.xml
data 是我为您的数据文件命名的名称,data.xml 是数据最终存放的位置。
输出如下:
<?xml version="1.0" encoding="UTF-8"?>
<rows>
<C>
<num_tel>0998452223</num_tel>
<name>gwenael</name>
<num_comd>12345 </num_comd>
</C>
<C>
<num_tel>0966442312</num_tel>
<name>marcel</name>
<num_comd>654321 </num_comd>
</C>
<D>
<id_client>23D</id_client>
<num_fixe>1045227937</num_fixe>
<name>judith</name>
</D>
<X>
<name>paul</name>
</X>
<Z>
<name>toto</name>
</Z>
<C>
<num_tel>0954674487</num_tel>
<name>marie</name>
<num_comd>78944</num_comd>
</C>
<C>
<num_tel>0998452223</num_tel>
<name>jacque</name>
<num_comd>18845</num_comd>
</C>
<Z>
<name>trucmuche</name>
</Z>
<D>
<id_client>23D</id_client>
<num_fixe>1045227937</num_fixe>
<name>tata</name>
</D>
</rows>
我确定我没有为 XML 文件的各个部分使用正确的术语,但此输出可以由浏览器作为“有效”(可解析)XML 加载。如果应该将此文件提供给其他任何人,您可能需要查看 DTD。
以下是一般分类:
- 在
BEGIN 块中,将字段分隔符设置为;,初始化每个“对象”和documentEnclosingTag 所需的输出字段等变量,然后打印通用XML 标头以及documentEnclosingTag
- 在
FNR==1 块中,将第一行数据作为标题并将它们放入cols 数组中,以便稍后可以通过其标题名称引用flds。使用gsub 调用清理数据以修剪列名
- 对于每个
$(cols["id_client"]) 块,通过指定一个 enclosureTag 值和匹配的所需 flds 数组,打印一个适当的“对象”。
- 在
END,打印结束documentEnclosingTag
功能方面:
-
wrapData 在数据周围创建一个带有封闭标签的字符串。
-
createObject 使用 wrapData 为“对象”本身创建元素和封闭标签,其中我使用 awk 的标准字符串连接添加了一些输出格式。 flds 数组表示所需的输出字段。 key 和 s 是函数的局部变量。每个fld、数据和标签都连接到s,最后s被enclosingTag包裹,并作为字符串返回。