0

非常に大きなファイルに次のxml構造があります。

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

sitタグの値を引くにはどうすればよいですか?タグは、 ;で区切られた3つの値で構成されます。それぞれを特定の数から引く必要があります。

任意のUNIXツールを使用できます。(awk、sed、bcなど)

したがって、その特定の数値が最初の値で1000、2番目の値で100、3番目の値で10の場合、結果は次のようになります。

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

分数を保持する必要はありません。

4

3 に答える 3

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>
于 2013-02-09T00:50:49.580 に答える
2

を使用する1つの方法があり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>

出力をフォーマットする方法について完全に明確にされていません。整数が正か負かに関係なく、最大6つの先行ゼロを整数に埋めたいようです。上記のスクリプトはそれを行います。そのゼロが実際にタイプミスである場合は、このワンライナーで十分です。

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>
于 2013-02-09T01:37:28.147 に答える
1

パーサーperlの助けを借りて使用する1つの方法:XML::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>
于 2013-02-08T23:10:04.583 に答える