如何在awk中对xml文件执行算术运算

时间:2014-07-05 05:52:27

标签: xml bash awk sed

如果文件中有列,则可以轻松进行算术运算。但是,如果要读取xml文件,请在算术上修改特定标记,然后将更改写入相同的文件。

以下面的代码段为例:

<product>
  <programname>Bla</programname>
  <programurl>blah.com</programurl>
  <catalogname>beep it</catalogname>
  <lastupdated>ridiculous</lastupdated>
  <name>Another pile of garbage</name>
  <keywords>whatever</keywords>
  <description>random</description>
  <currency>USD</currency>
  <price>3.99</price>
  <buyurl>deeplyrandomurl.html</buyurl>
</product>
<product>
  <programname>nowheretownthing</programname>
  <programurl>sick.com</programurl>
  <catalogname>beep it</catalogname>
  <lastupdated>ridiculous</lastupdated>
  <name>Another pile of garbage</name>
  <keywords>whatever</keywords>
  <description>random</description>
  <currency>USD</currency>
  <price>10.78</price>
  <buyurl>deeplyrandomurl.html</buyurl>
</product>

在庞大的xml文件中有许多这样的<product>块。我们如何修改每个<price>子标签并将更改写入文件?有什么建议吗?

2 个答案:

答案 0 :(得分:1)

使用p.awk作为awk计划:

p.awk

{
  if ($L ~ /\<price>/)
  {
    split($L,a,">");
    split(a[2],b,"<");
    gsub(">.*<",">"2*b[1]"<",$L);
  }
  print $L
}

然后

cat file | awk -f p.awk

答案 1 :(得分:0)

如果你想在这里使用sed是一个可能的解决方案。您在bash脚本中编写以下代码(比如说script.sh):

#!/bin/bash

tr '\n' ';' < XMLFILE > TEMPFILE
c=1

for i in $(sed -n 's/.*price>\([0-9]*\.*[0-9]*\)<\/price>/\1/p' XMLFILE); do
    i=$(awk -v i="$i" 'BEGIN{print (i*2)}')
    sed -i "s/<price>\([0-9]*\.*[0-9]*\)<\/price>/<price>$i<\/price>/$c" TEMPFILE
    c=$((c+1))
done

tr ';' '\n' < TEMPFILE > XMLFILE
rm -f TEMPFILE

然后你只需执行脚本:

./script.sh