linux - 解析 XML - 从标签中减去值

标签 linux xml-parsing sed awk bc

我在一个非常大的文件中有以下 xml 结构:

<sit>619709.6044;144998.7059;-090372.58119</sit>
<vll>0;0;0</vll>
<cor>255;0;255</cor>

如何减去 sit 标签中的值?该标签由三个值组成,由 ; 分隔,每个值都必须从特定数字中减去。

可以使用任何 unix 工具。 (awk、sed、bc 等)

因此,如果第一个值的特定数字是 1000,第二个值是 100,第三个值是 10,则结果将是:

<sit>618709;144898;-090362</sit>
<vll>0;0;0</vll>
<cor>255;0;255</cor>

无需保留分数。

最佳答案

这是使用 awk 的一种方法。像这样运行:

awk -v a=1000 -v b=100 -v c=10 -F "[<;>]" -v OFS=";" -f ./script.awk file

script.awk 的内容:

/^<sit>/ && /<\/sit>$/ {
    $0 = "<sit>" format($3, a) OFS format($4, b) OFS format($5, c) "</sit>"
}1

function format(field, var) {
    f = sub(/^-/, "", field)
    return (f == 1 ? "-" : "") sprintf("%06d", int(field-var))
}

结果:

<sit>618709;144898;-090362</sit>
<vll>0;0;0</vll>
<cor>255;0;255</cor>

您还没有完全清楚如何格式化您的输出。看起来您希望用最多六个前导零填充整数,无论​​它们是正数还是负数。上面的脚本会做到这一点。如果那个零实际上是一个拼写错误,那么这个一行就足够了:

awk -v a=1000 -v b=100 -v c=10 -F "[<;>]" -v OFS=";" '/^<sit>/ && /<\/sit>$/ { $0 = "<sit>" sprintf("%06d",int($3-a)) OFS sprintf("%06d",int($4-b)) OFS sprintf("%06d",int($5-c)) "</sit>" }1' file

结果:

<sit>618709;144898;-90382</sit>
<vll>0;0;0</vll>
<cor>255;0;255</cor>

关于linux - 解析 XML - 从标签中减去值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14782581/

相关文章:

linux - 无法在 Linux 上安装 Compiz

xml - 我需要有关在 T-SQL 中解析 XML 的帮助

java - 解析 .json 文件 (java)。尝试从文件中获取项目,结果为 null

sed - 在 sed 命令和范围地址中使用不同的分隔符

c++ - SDL2 : How to keep aspect ratio when resizing the window

python - cron任务设置环境变量失败

regex - 使用 bash 查找文件时提取部分文件名

python - 使用文件夹名称作为文本文件中的一列

linux - 进程结束后 QSerialPort 对 `/dev/ttyS*` 的影响?

javascript - Node.js 错误处理——如何处理导致错误的未定义值