免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2456 | 回复: 5
打印 上一主题 下一主题

文本排序问题求助各位大侠 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-01 18:53 |只看该作者 |倒序浏览
a.txt数据格式如下:
/* MOC = MODULE */                                                   
ADD MODULE:MID=30,MT=SCU
ADD MODULE:MID=34,MT=SCU
ADD MODULE:MID=29,MT=SCU
ADD MODULE:MID=31,MT=SCU
ADD MODULE:MID=32,MT=SCU
ADD MODULE:MID=33,MT=SCU

/* MOC = LDMI */
ADD LDMI:LDID=1,ADDRT=IPADDRESS
ADD LDMI:LDID=0,ADDRT=DOMAINNAME

/* MOC = TDMI */
ADD TDMI:CID=0,TDID=1,ADDRT=DOMAINNAME
ADD TDMI:CID=2,TDID=0,ADDRT=IPADDRESS
ADD TDMI:CID=0,TDID=10,ADDRT=IPADDRESS
ADD TDMI:CID=0,TDID=2,ADDRT=IPADDRESS

需排序成如下结果:
/* MOC = MODULE */
ADD MODULE:MID=29,MT=SCU
ADD MODULE:MID=30,MT=SCU
ADD MODULE:MID=31,MT=SCU
ADD MODULE:MID=32,MT=SCU
ADD MODULE:MID=33,MT=SCU
ADD MODULE:MID=34,MT=SCU

/* MOC = LDMI */
ADD LDMI:LDID=0,ADDRT=DOMAINNAME
ADD LDMI:LDID=1,ADDRT=IPADDRESS

/* MOC = TDMI */
ADD TDMI:CID=0,TDID=1,ADDRT=DOMAINNAME
ADD TDMI:CID=0,TDID=2,ADDRT=IPADDRESS
ADD TDMI:CID=0,TDID=10,ADDRT=IPADDRESS
ADD TDMI:CID=2,TDID=0,ADDRT=IPADDRESS

请各位大侠帮忙看看如何用shell实现,特别是TDMI那块,想了很久也找不到好思路。
不胜感激!

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
2 [报告]
发表于 2011-01-01 19:26 |只看该作者
awk '/* MOC =/{close("sort");print}/ADD/{print $0|"sort"}' a.txt

论坛徽章:
0
3 [报告]
发表于 2011-01-01 20:52 |只看该作者
回复 2# ziyunfei

谢谢大虾,执行结果如下,TDMI那段还有些小问题,应为,请再帮忙看看如何修改实现?
/* MOC = TDMI */
ADD TDMI:CID=0,TDID=1,ADDRT=DOMAINNAME
ADD TDMI:CID=0,TDID=2,ADDRT=IPADDRESS
ADD TDMI:CID=0,TDID=10,ADDRT=IPADDRESS
ADD TDMI:CID=2,TDID=0,ADDRT=IPADDRESS


$ cat a.txt|awk '/* MOC =/ {close("sort"); print $0} /ADD/ {print $0|"sort"}'
/* MOC = MODULE */
ADD MODULE:MID=29,MT=SCU
ADD MODULE:MID=30,MT=SCU
ADD MODULE:MID=31,MT=SCU
ADD MODULE:MID=32,MT=SCU
ADD MODULE:MID=33,MT=SCU
ADD MODULE:MID=34,MT=SCU
/* MOC = LDMI */
ADD LDMI:LDID=0,ADDRT=DOMAINNAME
ADD LDMI:LDID=1,ADDRT=IPADDRESS
/* MOC = TDMI */
ADD TDMI:CID=0,TDID=1,ADDRT=DOMAINNAME
ADD TDMI:CID=0,TDID=10,ADDRT=IPADDRESS
ADD TDMI:CID=0,TDID=2,ADDRT=IPADDRESS
ADD TDMI:CID=2,TDID=0,ADDRT=IPADDRESS

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
4 [报告]
发表于 2011-01-02 00:57 |只看该作者
回复  ziyunfei

谢谢大虾,执行结果如下,TDMI那段还有些小问题,应为,请再帮忙看看如何修改实现?
/ ...
huatuo20002008 发表于 2011-01-01 20:52



条件限制:
ADD ...xx=val1,yyyy=val2
val2非数字时,val1不可重复

# cat moc.pl
  1. #!/usr/bin/perl

  2. use strict;

  3. sub sort_out{
  4.     my %hData = @_;
  5.     foreach(sort keys %hData){
  6.         print "$hData{$_}";
  7.     }
  8. }

  9. my %hData = ();
  10. while(<>){
  11.     if(m/^\s*$/){
  12.         sort_out(%hData);
  13.         %hData = ();
  14.         print;
  15.         next;
  16.     }
  17.    
  18.     if(m!^\s*/\*!){
  19.         print;
  20.     }else{
  21.         my ($sK1, $sK2) = (split /[,=]/, $_)[1,3];
  22.         my $sIndex = sprintf("%03d%03d", $sK1, $sK2);
  23.         $hData{$sIndex} = $_;      
  24.     }
  25. }
  26. sort_out(%hData);
复制代码
# perl moc.pl a.txt
/* MOC = MODULE */
ADD MODULE:MID=29,MT=SCU
ADD MODULE:MID=30,MT=SCU
ADD MODULE:MID=31,MT=SCU
ADD MODULE:MID=32,MT=SCU
ADD MODULE:MID=33,MT=SCU
ADD MODULE:MID=34,MT=SCU

/* MOC = LDMI */
ADD LDMI:LDID=0,ADDRT=DOMAINNAME
ADD LDMI:LDID=1,ADDRT=IPADDRESS

/* MOC = TDMI */
ADD TDMI:CID=0,TDID=1,ADDRT=DOMAINNAME
ADD TDMI:CID=0,TDID=2,ADDRT=IPADDRESS
ADD TDMI:CID=0,TDID=10,ADDRT=IPADDRESS
ADD TDMI:CID=2,TDID=0,ADDRT=IPADDRESS

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
5 [报告]
发表于 2011-01-02 04:06 |只看该作者
本帖最后由 yinyuemi 于 2011-01-02 04:17 编辑
  1. $ cat file |awk -v FS="[=,]" '{print ($2~/^[0-9]/?$2:"0"),($4~/^[0-9]/?$4:"0"),$0}' |awk '/* MOC =/{close("sort -k1n -k2");print}/ADD/{print $0|"sort -k1n -k2"}' |cut -d" " -f3-7

  2. /* MOC = MODULE */
  3. ADD MODULE:MID=29,MT=SCU
  4. ADD MODULE:MID=30,MT=SCU
  5. ADD MODULE:MID=31,MT=SCU
  6. ADD MODULE:MID=32,MT=SCU
  7. ADD MODULE:MID=33,MT=SCU
  8. ADD MODULE:MID=34,MT=SCU
  9. /* MOC = LDMI */
  10. ADD LDMI:LDID=0,ADDRT=DOMAINNAME
  11. ADD LDMI:LDID=1,ADDRT=IPADDRESS
  12. /* MOC = TDMI */
  13. ADD TDMI:CID=0,TDID=1,ADDRT=DOMAINNAME
  14. ADD TDMI:CID=0,TDID=10,ADDRT=IPADDRESS
  15. ADD TDMI:CID=0,TDID=2,ADDRT=IPADDRESS
  16. ADD TDMI:CID=2,TDID=0,ADDRT=IPADDRESS
复制代码

论坛徽章:
0
6 [报告]
发表于 2011-01-02 11:15 |只看该作者
回复 5# yinyuemi

非常感谢楼上两位大侠,困扰了好久的问题终于在2011年元旦节搞定了,牛人真多啊!

cat c.txt|awk -v FS="[=,]" '!/(^ADD)/ {print $0} /(^ADD)/ {print ($2~/^[0-9]/?$2:"0"),($4~/^[0-9]/?$4:"0"),$0}' |awk '!/^[0-9]/ {close("sort -k1n -k2n");print}/ADD /{print $0|"sort -k1n -k2n"}'|sed -e 's/.*\(ADD \)\(.*\)/\1\2/g' > d4.txt
  /* MOC = MODULE */
ADD MODULE:MID=29,MT=SCU
ADD MODULE:MID=30,MT=SCU
ADD MODULE:MID=31,MT=SCU
ADD MODULE:MID=32,MT=SCU
ADD MODULE:MID=33,MT=SCU
ADD MODULE:MID=34,MT=SCU

/* MOC = LDMI */
ADD LDMI:LDID=0,ADDRT=DOMAINNAME
ADD LDMI:LDID=1,ADDRT=IPADDRESS

/* MOC = TDMI */
ADD TDMI:CID=0,TDID=1,ADDRT=DOMAINNAME
ADD TDMI:CID=0,TDID=2,ADDRT=IPADDRESS
ADD TDMI:CID=0,TDID=10,ADDRT=IPADDRESS
ADD TDMI:CID=2,TDID=0,ADDRT=IPADDRESS
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP