awk将csv转换为xml可选标记并重命名标记

时间:2015-04-11 10:09:13

标签: xml csv awk

name;num_tel;num_fixe;id_client;num_comd;email;city;date_liv
gwenael;0998452223;1038431234;50C;12345;gwa@yahoo.fr;London;08/07/2015
judith;0954674487;1045227937;23D;78965;judith@yahoo.fr;Toulouse;11/05/2015

从这个csv我使用awk命令输出这个xml。 我需要2个问题的帮助。 标签名称(名称; num_tel; num_fixe; id_client; num_comd; email;)是csv的默认值 和city;在用户生成csv之前已经添加了date_liv,他们可以在默认标记之后添加更多标记。 我的目标是输出我的xml中的所有选项标签,一旦它们在csv中输入 我尝试使用循环,但我有很多错误,我需要帮助做到这一点。 我从第7位开始,因为可选标签从那个位置开始直到结束。

NF==1 for (i=7;i<=NF;i++)
    { 
        printf " <option>%s</option>\n"
            printf " <val>%s</val>\n"
    }

其次,如何在我的awk脚本中将例如nummple num_tel的标签重命名为手机?

<rows>
 <C>
    <client> 
                <identity>              
                            <name> gwenael </name>

                                <M>
                                        <num_fixe> 0998452223 </num_fixe>
                                        <contact>
                                                <cell phone>1038431234 </cell phone>   <!--num_tel--!>
                                        </contact>  

                                        <option>city</option>       
                                        <value>London </value>
                                        <option>date_liv</option>
                                        <value>08/07/2015</value>

                                        <num_comd> 12345</num_comd>
                                </M>                                    
                </identity>
                                        <date_liv>08/07/2015</date_liv>
            <locomotion>car</locomotion>
</client>
</C>

<D>
    <pro> 
                <identity>              
                            <name> judith </name>

                                <id_client>23D</id_client>

                                <option>city</option>       
                                <value>Paris </value>
                                <option>date_liv</option>
                                <value>08/05/2015</value>

                                        <num_fixe> 0998452223 </num_fixe>
                            <company>
                                <num_fixe>1045227937</num_fixe>
                            </company>  
                                        <num_comd> 12345</num_comd>                                   
                </identity>
                                        <date_liv>08/07/2015</date_liv>
            <locomotion>car</locomotion>
    </pro>
</D>

1 个答案:

答案 0 :(得分:1)

关注将自定义字段添加到输出的问题,您可以使用类似的东西。您需要在适当的位置将这些部分插入到脚本中:

# set field separator
BEGIN { FS=";" }

# first line
NR == 1 {
    for (i=7; i<=NF; ++i) a[i] = $i # store field headers in array a
    next                            # skip to next line
}

# all other lines
{
    # print values along with the matching name from the array
    for (i=7; i<=NF; ++i) printf "<option>%s</option><value>%s</value>", a[i], $i
}

您所需的输出格式不清晰,因此我没有在代码中使用任何格式字符,但您可以在循环中的每个<option> - <value>对之后添加换行符使用内置的ORS(输出记录分隔符)变量:

printf "<option>%s</option><value>%s</value>%s", a[i], $i, ORS

使用ORS而不是\n的优点是它与平台无关,这意味着代码应该适用于在Windows中使用DOS行结尾或在其他系统上使用UNIX行结尾的文件。