免费注册 查看新帖 |

Chinaunix

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

[文本处理] shell如何解析带标签的文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-13 18:02 |只看该作者 |倒序浏览
如果文件中有如下形式的文本:
<tr>
<td>
Title
</td>
<td>
321
</td>
<td>
123
</td>
</tr>
<tr>
<td>
RECHARGE_ID
</td>
<td>
&nbsp;
</td>
<td>
&nbsp;
</td>
<td>
</tr>
....

每一个<tr>的第一个<td>中数据为文字说明, 后面<td>内容为要比较的内容,如果不一致,就输出类似的格式。
Title:  321  vs 123

注意除了第一个title外,后面<td>的个数可能有2n个 或者2n+1个. 如果后者,就输出为失败.


如果为偶数则将前面N个数据对比后面N个数据,比如有4个<data>的话,形如:
<tr>
<td>
Title
</td>
<td>
val1
</td>
<td>
val2
</td>
<td>
val3
</td>
<td>
val4
</td>
</tr>
....
val1,val3 对比;val22, val4对比等。


Title:  val1 vs val3
         val2 vs val4




论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
2 [报告]
发表于 2014-03-13 18:28 |只看该作者
这么典型的 HTML文件, 为啥非要用 shell来处理?

论坛徽章:
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
3 [报告]
发表于 2014-03-13 18:48 |只看该作者
回复 1# lzq123335

# awk '/^<tr>/{t=-1}/^<td>/{getline;if(t++<0){T=$1":"}else{a[t]=$1}}/^<\/tr>/{if(t%2){print "FAILED!!!"}else{for(n=1;n<t;n+=2)if(a[n]!=a[n+1]){print T,a[n]" vs "a[n+1];gsub("."," ",T)}}}' FILE
Title: val1 vs val2
       val3 vs val4
   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
4 [报告]
发表于 2014-03-13 22:06 |只看该作者
本帖最后由 yestreenstars 于 2014-03-14 09:28 编辑
  1. awk 'BEGIN{FS="\n";RS="<tr>"}NR>1{if((NF/3-2)%2)print "Failed";else{for(i=3;(i+=3)<=NF/2;){if($i==$(i+NF/2-3))continue;t=$i" vs "$(i+NF/2-3);s=s?s"\n\t"t:$3":\t"t};print s;s=""}}'
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
5 [报告]
发表于 2014-03-13 22:10 |只看该作者
回复 3# jason680

楼主想要的结果是:
如果有4组的话应该是1vs3、2vs4
如果有6组的话应该是1vs4、2vs5、3vs6
……   

论坛徽章:
0
6 [报告]
发表于 2014-03-13 22:58 |只看该作者
回复 2# q1208c


  这个其实是一个excel文件,我只截取了其中一段。想在linux下面进行比较,除了shell还有其他什么方法么?

论坛徽章:
0
7 [报告]
发表于 2014-03-13 22:59 |只看该作者
回复 5# yestreenstars


    是的。

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
8 [报告]
发表于 2014-03-14 07:47 |只看该作者
回复 6# lzq123335

excel 文件 可以用 python 或 perl 的程序来处理. 至少灵活性比 shell要高很多.
   

论坛徽章:
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
9 [报告]
发表于 2014-03-14 09:17 |只看该作者
回复 5# yestreenstars

thanks and modify

# awk '/^<tr>/{t=-1}/^<td>/{getline;if(t++<0){T=$1":"}else{a[t]=$1}}/^<\/tr>/{if(t%2){print "FAILED!!!"}else{t/=2;for(n=1;n<=t;n++)if(a[n]!=a[n+t]){print T,a[n]" vs "a[n+t];gsub("[^ ]"," ",T)}}}' FILE
Title: val1 vs val3
       val2 vs val4

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP