Shell 使用awk生成xml

Shell 使用awk生成xml,shell,awk,Shell,Awk,我正在尝试使用awk生成xml,如下所示。输入文件: 10.112.232.34|bl|1 10.23.435.21|bl|1 34.4532.32.1|bl|0 预期的输出应该是 <Update version="1"> <BlackListed_IP> <Added> <value IP="180.104.243.1" CODE="BL"></value>

我正在尝试使用awk生成xml,如下所示。输入文件:

10.112.232.34|bl|1
10.23.435.21|bl|1
34.4532.32.1|bl|0
预期的输出应该是

<Update version="1">
    <BlackListed_IP>
            <Added>
                    <value IP="180.104.243.1" CODE="BL"></value>
                    <value IP="180.104.243.1" CODE="BL"></value>
            </Added>
            <Deleted>
                    <value IP="180.104.243.1" CODE="BL"></value>
            </Deleted>
    </BlackListed_IP>
$cat tst.awk
开始{FS=“[|]”
$3==1{addedIp[++numAdded]=1;addedCode[numAdded]=2;next}
{deletedIp[++numDeleted]=$1;deletedCode[numDeleted]=$2}
结束{
printf“\n”,更新\u版本
打印“”
打印“”
对于(i=1;i
IP=“10.23.435.21”CODE=“BL”>
IP=“34.4532.32.1”CODE=“BL”>

我建议使用。请参见:++ve获取好代码,先生,您准备好从SO处购买衬衫了:)我相信他们会提供10万英镑回购,干杯。
function prepere_xml{
while IFS='' read -r line || [[ -n "$line" ]];
do
    while IFS='|' read f1 f2 f3
       if [ "$f3" == 1 ]; then
           awk -v c="$line" -F\| 'BEGIN{printf "<Update version=\"%s\">\n        <BlackListed_IP>\n                <Added>\n", c} {printf "                        <value IP=\"%s\" CODE=\"%s\"></value>\n", $1, $2} END {printf "                </Added>\n        </BlackListed_IP>\n</Update>"}' $collect_sid_msg > Generated_Delta.xml
       else
           awk -v c="$line" -F\| 'BEGIN{printf "                <Deleted>\n", c} {printf "                        <value IP=\"%s\" CODE=\"%s\"></value>\n", $1, $2} END {printf "                </Deleted>\n</Update>"}' $collect_sid_msg >> Generated_Delta.xml
       fi
    done<$input_file
done < $update_version
}
1
$ cat tst.awk
BEGIN { FS="[|]" }
$3 == 1 { addedIp[++numAdded]=$1; addedCode[numAdded]=$2; next }
{ deletedIp[++numDeleted]=$1; deletedCode[numDeleted]=$2 }
END {
    printf "<Update version=\"%d\">\n", update_version
    print  "    <Blacklisted_IP>"
    print  "        <Added>"
    for (i=1; i<=numAdded; i++) {
        printf  "            <value> IP=\"%s\" CODE=\"%s\"></value>\n", addedIp[i], toupper(addedCode[i])
    }
    print  "        </Added>"
    print  "        <Deleted>"
    for (i=1; i<=numDeleted; i++) {
        printf  "            <value> IP=\"%s\" CODE=\"%s\"></value>\n", deletedIp[i], toupper(deletedCode[i])
    }
    print  "        </Deleted>"
    print  "    </Blacklisted_IP>"
}

$ awk -v update_version=1 -f tst.awk file
<Update version="1">
    <Blacklisted_IP>
        <Added>
            <value> IP="10.112.232.34" CODE="BL"></value>
            <value> IP="10.23.435.21" CODE="BL"></value>
        </Added>
        <Deleted>
            <value> IP="34.4532.32.1" CODE="BL"></value>
        </Deleted>
    </Blacklisted_IP>