如何从xml文件中排序特定值

时间:2010-09-19 21:50:47

标签: xml sed awk

我有一个xml文件,如下所示:

<Exchange DateTime="17/09/2010 18:00:00">
<Content Percent="0.20" Price="63.862" Sign="1"/>
<Content Percent="0.25" Price="80.989" Sign="1"/>
<Content Percent="0.07" Price="1.4970" Sign="1"/>
<Content Percent="-0.31" Price="1.9530" Sign="-1"/>
</Exchange>

有4个变量叫做A,B,C,D。

我需要一个输出如下的脚本:

Last update: 17/09/2010 18:00:00 
A: 63.862 (% 0.20) 
B: 80.989 (% 0.25)
C: 1.4970 (% 0.07) 
D: 1.9530 (% -0.31)

这可能吗?嗯,我真的需要我的工作:(请帮助我,ppl。我真的很感谢你的帮助!!

3 个答案:

答案 0 :(得分:0)

#!/bin/bash
echo Last update: `grep -o 'DateTime="[^"]*"' $1 | sed -e 's/DateTime="\([^"]*\)"/\1/'`
grep -o 'Percent="[^"]*" Price="[^"]*"' $1 | 
       sed -e 's/Percent="\([^"]*\)" Price="\([^"]*\)"/: \2 (% \1)/'

这将显示

Last update: 17/09/2010 18:00:00
: 63.862 (% 0.20)
: 80.989 (% 0.25)
: 1.4970 (% 0.07)
: 1.9530 (% -0.31)

不知道IMKB,USD和EUR是什么意思,如果它们是基于Percent那么你可以使用这个

#!/bin/bash
echo Last update: `grep -o 'DateTime="[^"]*"' $1 | sed -e 's/DateTime="\([^"]*\)"/\1/'`
grep -o 'Percent="[^"]*" Price="[^"]*"' $1 | 
       sed -e 's/Percent="\([^"]*\)" Price="\([^"]*\)"/: \2 (% \1)/' |
       sed -e 's/\(.*(% 0.20)\)/IMKB: \1/' | 
       sed -e 's/\(.*(% 0.07)\)/USD: \1/' |
       sed -e 's/\(.*(% -0.31)\)/EUR: \1/'

上面会显示

Last update: 17/09/2010 18:00:00
IMKB: : 63.862 (% 0.20)
: 80.989 (% 0.25)
USD: : 1.4970 (% 0.07)
EUR: : 1.9530 (% -0.31)

我不太了解sed,所以可能只使用sed进行简单而短暂的溶解。

<强>更新 这是较短的版本

#!/bin/bash

echo Last update: `grep -o 'DateTime="[^"]*"' $1 | sed -e 's/DateTime="\([^"]*\)"/\1/'`
grep -o 'Percent="[^"]*" Price="[^"]*"' $1 | sed -e 's/Percent="\([^"]*\)" Price="\([^"]*\)"/: \2 (% \1)/' -e 's/\(.*(% 0.20)\)/IMKB\1/' -e 's/\(.*(% 0.07)\)/USD\1/' -e 's/\(.*(% -0.31)\)/EUR\1/' -e 's/\(.*(% 0.25)\)/SD\1/'

Last update: 17/09/2010 18:00:00
IMKB: 63.862 (% 0.20)
SD: 80.989 (% 0.25)
USD: 1.4970 (% 0.07)
EUR: 1.9530 (% -0.31)

答案 1 :(得分:0)

http://cnnturk.com/finans/ticker/endeks.asp是我获取XML文件的地方,但它没有新行,所以我在使用curl时无法使用你的解决方案:(

我的目的是提出一个shell脚本,它从上面提到的地址收集数据,然后显示有关证券交易所指数,黄金,美元和欧元的价格和价格变化的信息。

我需要使用curl,awk,sed和grep来完成这个,但我无法弄清楚是怎么回事,因为它需要复杂地使用shell编程技巧。

答案 2 :(得分:-1)

希望这会有所帮助。 即使我是Perl的新手。只是试着运气。

open CONFIG,"example.dat";
    while(<CONFIG>)
    {
    if($.==1)
    {
     s/.*\"(\d+\/\d+\/\d+ \d+:\d+:\d+)\".*$/Last update: $1/g;
    }
    if($.==2)
    {
    s/.*\"(-?\d+\.?\d+).*\"(\d+\.?\d+)\".*$/A: $2 (% $1)/g;
    }
    if($.==3)
    {
    s/.*\"(-?\d+\.?\d+).*\"(\d+\.?\d+)\".*$/B: $2 (% $1)/g;
    }
    if($.==4)
    {
    s/.*\"(-?\d+\.?\d+).*\"(\d+\.?\d+)\".*$/C: $2 (% $1)/g;
    }
    if($.==5)
    {
    s/.*\"(-?\d+\.?\d+).*\"(\d+\.?\d+)\".*$/D: $2 (% $1)/g;
    }
    s/<\/exchange>//i;
    print ;
    }


close CONFIG;