BBS.ChinaUnix.net
首页 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


如何对xml的内容进行排序
首页 » 论坛 » Shell »  
[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
tony9427
圣骑士




UID:588379
注册:2007-7-17
最后登录: 2008-10-08
帖子:95
精华:0

可用积分:102 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


1楼 发表于 2008-7-4 10:35 
需要对该xml内容进行排序,要求对username的值进行排序,从小到大列出,如果username是字母,则排在数字后面
感觉很复杂,该怎么解决?谢谢
  <provider name="TEST" protocol="TEST001">
    <setting>test</setting>
    <account username="86868" service-type="1">
      <payment type="subscr" account_id="156000" merchant_id="9SBMkJ8Q" category="4" />
      <payment type="otp" account_id="156000" merchant_id="9SBMkJ8Q" category="4" />
    </account>
    <account username="87654" service-type="1">
      <payment type="subscr" account_id="156000" merchant_id="9SBMkJ8Q" category="4" />
      <payment type="otp" account_id="156000" merchant_id="9SBMkJ8Q" category="4" />
    </account>
    <account username="40500" service-type="1">
      <payment type="subscr" account_id="156000" merchant_id="9SBMkJ8Q" category="11" />
      <payment type="otp" account_id="156000" merchant_id="9SBMkJ8Q" category="11" />
    </account>
    <account username="pgw" service-type="1">
      <payment type="subscr" account_id="156000" merchant_id="9SBMkJ8Q" category="11" />
      <payment type="otp" account_id="156000" merchant_id="9SBMkJ8Q" category="11" />
    </account>
   </provider>
</provider>



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
dotnetdotcn
侠客




UID:214673
注册:2005-1-11
最后登录: 2008-10-13
帖子:44
精华:0

可用积分:50 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


2楼 发表于 2008-7-4 11:37 
#!/usr/bin/perl -w

use strict;
use warnings;

use XML::Simple;

my $xml = XMLin('./test.xml');
my $account = $xml->{account};
my $len = scalar(@$account);
my $i;
for($i = 0 ; $i < $len ; $i++)
{
        print $xml->{account}->[$i]->{username}."\n";
}

用perl吧,剩下的自己看看怎么做吧,期待有shell高手解答这个问题,我也想知道如何用shell处理这种文件



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
edei2004   帅哥 (tao)
圣骑士



UID:604603
注册:2007-8-18
最后登录: 2008-09-08
帖子:104
精华:0

可用积分:146 (白手起家)
信誉积分:0
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


3楼 发表于 2008-7-4 12:05 
我的思路是先把
    <account .......>
     .................
    </account>   整成一行.然后通过比较,可以调整到位.不过由于水平有限写出的代码比较繁琐
sed -n '1,2p' oldfile > newfile
cat oldfile |nawk '/<account/{while($0!~/provider/){print $0;getline;}}'|nawk '{for(i=1;i<4;i++){if($1~/account/){str=$0}else{str=str"@"$0}getline;}print str}'|sort +1|tr '@' '\n'>>newfile
tail -2 oldfile >> newfile

最后newfile就是调整后的XML文件了,如果楼主急用可以满足条件.  
期待更好的答案  :P



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
tony9427
圣骑士




UID:588379
注册:2007-7-17
最后登录: 2008-10-08
帖子:95
精华:0

可用积分:102 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


4楼 发表于 2008-7-4 12:34 


QUOTE:
原帖由 edei2004 于 2008-7-4 12:05 发表
我的思路是先把
   
     .................
       整成一行.然后通过比较,可以调整到位.不过由于水平有限写出的代码比较繁琐
sed -n '1,2p' oldfile > newfile
cat oldfile |nawk '/

多谢啦,省了我不少时间 :em03: :wink:



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
tony9427
圣骑士




UID:588379
注册:2007-7-17
最后登录: 2008-10-08
帖子:95
精华:0

可用积分:102 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


5楼 发表于 2008-7-4 12:35 
while($0!~/provider/) 是什么意思
getline是哪里的函数阿

[ 本帖最后由 tony9427 于 2008-7-4 12:44 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
blackold   帅哥 (黑哥)
大天使



UID:631768
注册:2007-10-22
最后登录: 2008-10-16
帖子:2120
精华:0

可用积分:4404 (小富即安)
信誉积分:0
专家积分:91 (本版:91)
空间积分:0
推广积分:0

来自:北海
状态:...在线...

[个人空间] [短信] [博客]


6楼 发表于 2008-7-4 12:47 
回复 #1 tony9427 的帖子

try gawk:

$ sed 's/.*<account.*/\n&/' urfile |awk  'BEGIN { RS=""} /<account/{a[NR]=$0} !/<account/; END { num=asort(a);for(i=1;i<=num; i++) print a[i]}'  

not gawk:

$ csplit -f urfile urfile '/.*<account/' '/<\/provider/'

$ cat b.txt00 <(sed '/<account/{:a; /<\/account>/b;N;/<\/account>/s/\n/|/g;ba}' b.txt01| sort -t \" -k 2|sed 's/|/\n/g') b.txt02

针对<account>与</account>同行的问题作了些修改。

[ 本帖最后由 blackold 于 2008-7-5 19:35 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

LIVE FREE OR DIE!     K.I.S.S.


积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
sywolf   帅哥
圣骑士




UID:154111
注册:2004-4-24
最后登录: 2008-09-21
帖子:91
精华:0

可用积分:88 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

来自:成都
状态:...离线...

[个人空间] [短信] [博客]


7楼 发表于 2008-7-4 13:00 
思路,先去掉头两行和末两行,再对中间的account进行排序
sed '/account/{N;N;N;s/\n//g}' a|sort -k2
最后把头两行和末两行拿来组合



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

学习学习再学习
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
tony9427
圣骑士




UID:588379
注册:2007-7-17
最后登录: 2008-10-08
帖子:95
精华:0

可用积分:102 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


8楼 发表于 2008-7-4 14:27 


QUOTE:
原帖由 sywolf 于 2008-7-4 13:00 发表
思路,先去掉头两行和末两行,再对中间的account进行排序
sed '/account/{N;N;N;s/\n//g}' a|sort -k2
最后把头两行和末两行拿来组合

可是如果account中间的行数不是固定的呢?



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
edei2004   帅哥 (tao)
圣骑士



UID:604603
注册:2007-8-18
最后登录: 2008-09-08
帖子:104
精华:0

可用积分:146 (白手起家)
信誉积分:0
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


9楼 发表于 2008-7-4 14:45 
account中间的行数不是固定的, 可以通过直接
    <account   ......... </account > 做为关键字来判断一条完整



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
tony9427
圣骑士




UID:588379
注册:2007-7-17
最后登录: 2008-10-08
帖子:95
精华:0

可用积分:102 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


10楼 发表于 2008-7-4 18:32 
回复 #9 edei2004 的帖子

是的,可是搞不定



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?

首页 » 论坛 » Shell »


 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 0.186679 second(s), 4 queries , Gzip enabled