创建一个XML文件,该文件由一个包含2个字段和N行的文件提供

2024-09-30 20:21:47 发布

您现在位置:Python中文网/ 问答频道 /正文

不知道该怎么做,bash,awk,python,other,所以欢迎提供建议和/或各种解决方案。如果这个问题太宽泛,我道歉

这是我的示例演示文件

Title1,Query1 
Title2,Query2 
Title3,Query3 
...
TitleN,QueryN

这是我想要的输出文件:
基本上我希望上面的demofile每行1<row>...</row>
因此,如果demofile中有N行,那么我将有一个N行的outputfile<row>...</row>
标题和查询在每个<row>...</row>中相应地改变。 所以基本上遍历demofile得到这个输出文件

  <row>
    <panel>
      <title>
Title1
      </title>
      <chart>
        <search>
          <query>
Query1 
            </query>
          <earliest>-24h@h</earliest>
          <latest>now</latest>
          <sampleRatio>1</sampleRatio>
        </search>
        <option name="charting.chart">line</option>
      </chart>
    </panel>
  </row>
 ...
   <row>
    <panel>
      <title>
TitleN
      </title>
      <chart>
        <search>
          <query>
QueryN 
            </query>
          <earliest>-24h@h</earliest>
          <latest>now</latest>
          <sampleRatio>1</sampleRatio>
        </search>
        <option name="charting.chart">line</option>
      </chart>
    </panel>
  </row>

我的实际演示文件如下所示,因此解决方案必须实际处理各种字符:

index=snmp_stats sourcetype=snmp_collector_log  device=* | timechart span=5m sum(globalStatPktsRcvd) by device,Total packets received (in the last period) - sum(globalStatPktsRcvd)
index=snmp_stats sourcetype=snmp_collector_log  device=* | timechart span=5m sum(globalStatPktsRcvdRate) by device,Packets received per second† - sum(globalStatPktsRcvdRate)

编辑下面的我的演示文件,共有两列,以逗号分隔,每列的开头和结尾都有双引号

"index=snmp_stats sourcetype=snmp_collector_log  device=* | timechart span=5m sum(globalStatPktsRcvd) by device","Total packets received (in the last period) - sum(globalStatPktsRcvd)"
"index=snmp_stats sourcetype=snmp_collector_log  device=* | timechart span=5m sum(globalStatPktsRcvdRate) by device","Packets received per second† - sum(globalStatPktsRcvdRate)"

如果我使用上面的实际演示文件,这就是所需的输出(尽管看起来不那么容易-这就是为什么我使用上面的示例演示文件) 在实际的演示文件中有2行代码,因此有2 <row>...</row>。 唯一的更改是在title和query标记中

  <row>
    <panel>
      <title>
Total packets received (in the last period) - sum(globalStatPktsRcvd)
      </title>
      <chart>
        <search>
          <query>
index=snmp_stats sourcetype=snmp_collector_log  device=* | timechart span=5m sum(globalStatPktsRcvd) by device
            </query>
          <earliest>-24h@h</earliest>
          <latest>now</latest>
          <sampleRatio>1</sampleRatio>
        </search>
        <option name="charting.chart">line</option>
      </chart>
    </panel>
  </row>
 ...
   <row>
    <panel>
      <title>
Packets received per second† - sum(globalStatPktsRcvdRate)
      </title>
      <chart>
        <search>
          <query>
index=snmp_stats sourcetype=snmp_collector_log  device=* | timechart span=5m sum(globalStatPktsRcvdRate) by device
            </query>
          <earliest>-24h@h</earliest>
          <latest>now</latest>
          <sampleRatio>1</sampleRatio>
        </search>
        <option name="charting.chart">line</option>
      </chart>
    </panel>
  </row>

Tags: 文件searchindextitledevicechartquerylatest
2条回答

为了简单起见,我只写相关的标签,其余的只是在前后打印固定的文本

$ cat a.awk
BEGIN { FS = "\"|(\",\")" }

{
    printf "<title>\n  %s\n</title>\n", $3
    printf "<query>\n  %s\n</query>\n\n", $2
}

$ cat file
"index=snmp_stats sourcetype=snmp_collector_log  device=* | timechart span=5m sum(globalStatPktsRcvd) by device","Total packets received (in the last period) - sum(globalStatPktsRcvd)"
"index=snmp_stats sourcetype=snmp_collector_log  device=* | timechart span=5m sum(globalStatPktsRcvdRate) by device","Packets received per second† - sum(globalStatPktsRcvdRate)"

$ awk -f a.awk file
<title>
  Total packets received (in the last period) - sum(globalStatPktsRcvd)
</title>
<query>
  index=snmp_stats sourcetype=snmp_collector_log  device=* | timechart span=5m sum(globalStatPktsRcvd) by device
</query>

<title>
  Packets received per second† - sum(globalStatPktsRcvdRate)
</title>
<query>
  index=snmp_stats sourcetype=snmp_collector_log  device=* | timechart span=5m sum(globalStatPktsRcvdRate) by device    
</query>

我刚试过这个: 需要整理一下/改进一下

mapfile -t title_array <<<"$(awk -F',' '{print $1}' demofile)"
mapfile -t query_array <<<"$(awk -F',' '{print $2}' demofile)"

count=0;
while read p; do   
echo "$count"; 
echo -e "\n\n"; 

#echo "do title - count:$count"
#echo "${title_array[$count]}"

#echo "do query - count:$count"
#echo "${query_array[$count]}"

### note the double quotes to access the variable
echo '  <row>' >> outputfile
echo '    <panel>' >> outputfile
echo '      <title>' >> outputfile
echo "${title_array[$count]}" >> outputfile
echo '      </title>' >> outputfile
echo '      <chart>' >> outputfile
echo '        <search>' >> outputfile
echo '          <query>' >> outputfile
echo "${query_array[$count]}" >> outputfile
echo '            </query>' >> outputfile
echo '          <earliest>-24h@h</earliest>' >> outputfile
echo '          <latest>now</latest>' >> outputfile
echo '          <sampleRatio>1</sampleRatio>' >> outputfile
echo '        </search>' >> outputfile
echo '        <option name="charting.chart">line</option>' >> outputfile
echo '      </chart>' >> outputfile
echo '    </panel>' >> outputfile
echo '  </row>' >> outputfile

((count++)); 

done <demofile

相关问题 更多 >