中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]用批处理实现滤除文本中的重复行
作者:
标题: [求助]用批处理实现滤除文本中的重复行 上一主题 | 下一主题
zxone
初级用户




积分 38
发帖 13
注册 2007-5-11
状态 离线
『楼 主』:  [求助]用批处理实现滤除文本中的重复行

我想用批处理实现滤除文本中的重复行,使每行文本都是唯一的。
例如:
1.txt——源文件
1
1
1
2
2
3
4
5
5
5
6
6
7
7
8
8
9
0
2.txt——目标文件
1
2
3
4
5
6
7
8
9
0
首先是用for命令
for /f %a in (1.txt) do …… >>2.txt
接着用if和find配合实现
我的想法是用if命令判断find /c "%a" 2.txt的返回结果,以确认for命令读取的当前行是否已在2.txt文件中出现过,也就是说该行是重复行,但是if命令不大熟悉,如何用if和其它命令搭配实现判断,想借这一实例来学习不死一下。
同时问一下,它能够处理比较复杂的文本行吗,比如网址之类的。(其实,我本来就是想用它来处理文本中重复的网址的)。

使用find /c "1" 1.txt命令的返回结果
---------- 1.TXT: 3
注意1.txt及3前面的空字符,它们不是空格,用UE查看像是“_”下划线,我想是哪个控制字符吧,因此不能使用for /f “delims=1,2,3”的命令,该怎么办以及为什么用控制字符呢?


2008-4-4 20:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 2 楼』:  

用find命令是不行的,假设有这样两行:
123
12

用find就搞不定了,这个得用findstr。你的思路基本上是正确的。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2008-4-4 21:39
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
ngd
中级用户

拟谷盗


积分 312
发帖 108
注册 2007-1-21
状态 离线
『第 3 楼』:  

LZ的方法是正确的,但其实没必要那么麻烦,换个思路来做更简单
for /f "delims=" %%a in (1.txt) do (
    if not defined %%a set %%a=b & echo %%a>>result.txt
)
或者使用外部工具sed
sed -n "G;s/\n/&&/;/^\([ -~]*\n\).*\n\1/d; s/\n//;h;P" 1.txt
[ Last edited by ngd on 2008-4-13 at 01:15 PM ]



FLOSS
2008-4-4 22:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zxone
初级用户




积分 38
发帖 13
注册 2007-5-11
状态 离线
『第 4 楼』:  

回去又重新想了想,原来是昨天把for命令使用错了,应该是tokens=1.2.3,我错写成delims了,find 的回显---------- 1.TXT: 3之间是空格。下面的代码可以实现
type nul>22.txt&&for /f %a in (5.txt) do @for /f "tokens=1,2,3" %i in ('find /c "%a" 22.txt') do @if %k ==0 echo %a>>22.txt看了2楼的提醒,的确稍微复杂一点的find 命令实现不了,可用findstr命令。
唯一的问题是,for命令在读取一行文本时,遇到空格就停止,转读下行文本了,所以对于有空格的比较文本不能使用这行命令,各位分析一下

2008-4-6 12:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zxone
初级用户




积分 38
发帖 13
注册 2007-5-11
状态 离线
『第 5 楼』:  

虽然处理for 命令的读取行遇空格停止的问题可用for /f "delims=" ……解决,但还有一些细节问题,思考ing……

2008-4-6 12:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flyingphf
中级用户





积分 392
发帖 142
注册 2007-6-10
状态 离线
『第 6 楼』:  

这个 SED命令对网页不起效果

2008-4-10 17:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flyingphf
中级用户





积分 392
发帖 142
注册 2007-6-10
状态 离线
『第 7 楼』:  

说错了,是对中文不起效果

2008-4-10 18:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 8 楼』:  

3楼兄弟发的没有看懂

2008-4-10 20:44
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
flyingphf
中级用户





积分 392
发帖 142
注册 2007-6-10
状态 离线
『第 9 楼』:  

sed -n "G;s/\n/&&/;/^\([ -~]*\n\).*\n\1/d; s/\n//;h;P" 1.txt
试过了,这个对含有中文字符的不起作用啊

2008-4-21 12:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ngd
中级用户

拟谷盗


积分 312
发帖 108
注册 2007-1-21
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by flyingphf at 2008-4-10 18:07:
说错了,是对中文不起效果

晕 ~_~ sed有何不可 将正则稍作改动不就可以了
sed -n "G;s/\n/&&/;/^\(.*\n\).*\n\1/d; s/\n//;h;P" 1.txt




FLOSS
2008-6-19 14:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: