2013-02-08 240 views
0

減去值我有一個非常大的文件以下XML結構:XML解析 - 從標籤

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

如何減去在值坐標籤?標籤由三個值組成,分隔爲;每個都必須從一個特定的數字中減去。

可以使用任何unix工具。 (AWK,sed的,BC等)

因此,如果該特定的數爲1000對的第一個值,100爲第三值的第二值和10中的結果將是:

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

無需保持分數。

回答

2

下面是使用awk的一種方式。運行,如:中script.awk

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

內容:

/^<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> 
+0

正是我想要的...填充。對不起,我的功夫很弱。 – 2013-02-13 16:54:34

1

使用perlXML::Twig解析器的幫助的一種方式:

假設xmlfile具有以下數據:

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

script.pl代碼:它喜歡

#!/usr/bin/env perl 

use warnings; 
use strict; 
use XML::Twig; 
use POSIX qw<floor ceil>; 

my @substracts = qw<1000 100 10>; 

my $twig = XML::Twig->new(
    twig_handlers => { 
     'sit' => sub { 
      my @sit_values = map { $_ < 0 ? ceil $_ : floor $_ } split /;/, $_->text_only; 
      for my $i (0 .. $#substracts) { 
       $sit_values[ $i ] -= $substracts[ $i ]; 
      } 

      $_->set_text(join q|;|, @sit_values); 
     } 
    }, 
    pretty_print => 'indented', 
)->parsefile(shift)->print; 

運行:

perl-5.14.2 script.pl xmlfile 

國債收益率:

<root> 
    <sit>618709;144898;-90382</sit> 
    <vll>0;0;0</vll> 
    <cor>255;0;255</cor> 
</root> 
2
awk ' 
BEGIN{ split("1000 100 10",dec); FS=OFS=";" } 
gsub(/<\/?sit>/,"") { 
    for (i=1;i<=NF;i++) 
     $i = int($i - dec[i]) 
    $0="<sit>" $0 "</sit>" 
} 
1' file 
<sit>618709;144898;-90382</sit> 
<vll>0;0;0</vll> 
<cor>255;0;255</cor>