繁体   English   中英

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

[英]How to perform arithmetic operations on an xml file in awk

如果文件中有列,则可以轻松进行算术运算。 但是,如果您想读取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>子标签并将更改写入文件? 有什么建议么?

使用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

如果您想使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM