中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【已结】一个比较文件内容的难题
作者:
标题: 【已结】一个比较文件内容的难题 上一主题 | 下一主题
bobofu
新手上路





积分 13
发帖 8
注册 2007-5-11
状态 离线
『楼 主』:  【已结】一个比较文件内容的难题

文件内容示例(1000余条记录):

AAA,BBB,CC,D,EEEEEEEE,950
SSS,GGG,CC,F,EEEEEEEE,1000
SSS,GGG,CC,F,EEEEEEEE,800
PPP,YYY,FF,E,DDDDDDDD,1250
KKK,JJJ,HH,D,TTTTTTTT,400
KKK,JJJ,HH,D,TTTTTTTT,1200
KKK,JJJ,HH,D,TTTTTTTT,800

-------------------------------------------------------------------------------------------------

文件中存在以下情况,2条以上的记录前5项相同,最后1项不同,如:
SSS,GGG,CC,F,EEEEEEEE,1000
SSS,GGG,CC,F,EEEEEEEE,800

KKK,JJJ,HH,D,TTTTTTTT,400
KKK,JJJ,HH,D,TTTTTTTT,1200
KKK,JJJ,HH,D,TTTTTTTT,800

-------------------------------------------------------------------------------------------------

希望输出结果:
AAA,BBB,CC,D,EEEEEEEE,950
SSS,GGG,CC,F,EEEEEEEE,1000
PPP,YYY,FF,E,DDDDDDDD,1250
KKK,JJJ,HH,D,TTTTTTTT,1200

即:
1、前5项没有相同记录的,直接输出;
2、前5项有相同记录的,输出第6项数字最大的记录。

希望高手指点,谢谢!

[ Last edited by bobofu on 2010-4-16 at 14:56 ]

2010-4-16 11:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 2 楼』:  

gawk比较容易实现



2010-4-16 14:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 3 楼』:  


@echo off&setlocal enabledelayedexpansion
for /f "tokens=1-6 delims=," %%a in (a.txt) do if not defined han_%%a#%%b#%%c#%%d#%%e (set "han_%%a#%%b#%%c#%%d#%%e=%%f") else if %%f gtr !han_%%a#%%b#%%c#%%d#%%e! set "han_%%a#%%b#%%c#%%d#%%e=%%f"
for /f "tokens=1* delims==" %%a in ('set han_') do set a=%%a&set "a=!a:~4!"&set "a=!a:#=,!"&>>b.txt echo.!a!,%%b
这个批处理在实际运行中对原文本有很多要求,以AAA,BBB,CC,D,EEEEEEEE,950这一行为示例:在ABCDE所代表的字符中,不能有英文符号和空格,例如=等号,逗号;分号!叹号%等等。

[ Last edited by Hanyeguxing on 2010-4-16 at 14:31 ]

   此帖被 +1 点积分    点击查看详情   
评分人:【 bobofu 分数: +1  时间:2010-4-16 14:41




批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-4-16 14:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bobofu
新手上路





积分 13
发帖 8
注册 2007-5-11
状态 离线
『第 4 楼』:  谢谢Hanyeguxing!代码成功!

谢谢Hanyeguxing!代码成功!

我的文本符合你说的要求。

这句没有看懂:
for /f "tokens=1* delims==" %%a in ('set han_') do set a=%%a&set "a=!a:~4!"&set "a=!a:#=,!"&>>b.txt echo.!a!,%%b

2010-4-16 14:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 5 楼』:  

以AAA,BBB,CC,D,EEEEEEEE,950这一行为示例,定义变量后就是
han_AAA#BBB#CC#D#EEEEEEEE=950,其中变量名是han_AAA#BBB#CC#D#EEEEEEEE,变量值是950。
set han_就是显示所有以han_开头的变量,这个时候han_AAA#BBB#CC#D#EEEEEEEE=950就被匹配出来了。
for /f "tokens=1* delims==" %%a in ......,以=分隔他,所以%%a为han_AAA#BBB#CC#D#EEEEEEEE,%%b为950。
set a=%%a把%%a赋值给变量a,set "a=!a:~4!"则截取了这个变量的从第4个字符开始所有的字符,也就是这个时候a就是AAA#BBB#CC#D#EEEEEEEE。
set "a=!a:#=,!"把变量a中的所有#替换成,从而a 成了AAA,BBB,CC,D,EEEEEEEE。
>>b.txt echo.!a!,%%b实际就是>>b.txt echo.AAA,BBB,CC,D,EEEEEEEE,950
实际整个批处理就两个for整句,第一个for把符合条件的行内容定义为变量,第二for再把匹配的变量转换后输出。

[ Last edited by Hanyeguxing on 2010-4-16 at 15:29 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-4-16 15:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: