标题: [文本处理] [已解决]如何用批处理命令从文本中取出想要的行? [打印本页]
作者: johnson3333 时间: 2009-6-17 15:04 标题: [已解决]如何用批处理命令从文本中取出想要的行?
如何去掉重复的行
问题:
现有一个文本文件1.txt,路径c:\,里面有N行其中有的行是重复的,文本内容如下:
apple
johnson
johnson^^
johnson^^
我用什么命令可以取出含有"^^"的行,且该行如果重复的话只出现一次。
[ 本帖最后由 johnson3333 于 2009-6-18 11:50 编辑 ]
作者: tireless 时间: 2009-6-17 15:26
- @echo off
- (
- for /f "delims=" %%a in ('findstr /c:"^^" c:\a.txt') do (
- if not defined %%a set %%a= & echo;%%a
- )
- )>a_.txt
- start a_.txt
复制代码
作者: johnson3333 时间: 2009-6-17 16:23 标题: 回复 2楼 的帖子
非常感谢您的回复,我想再请教下,如果每行前面有空格的话要怎么做才行呢?
作者: tireless 时间: 2009-6-17 16:45 标题: 回复 3楼 的帖子
输出的时候要去掉字符前的空格?
还是比较重复行时先去掉前面的空格再比较,输出时保留前面的空格?
作者: johnson3333 时间: 2009-6-17 17:37 标题: 回复 4楼 的帖子
感谢您的关注,这个批处理在字符前面有空格的时候就没办法不取重复的行了
能在字符前面有空格的时候取出不重复的行就好了如: johnson
apple
john son^^
johnson^^
johnson^^
john son^^
得出结果:
john son^^
johnson^^
johnson^^
john son^^非常感谢你~~
[ 本帖最后由 johnson3333 于 2009-6-17 17:48 编辑 ]
作者: tireless 时间: 2009-6-17 18:04 标题: 回复 5楼 的帖子
改成这样:- @echo off
- (
- for /f "eol=▓ delims=" %%a in ('findstr /c:"^^" a.txt') do (
- if not defined #%%a set #%%a= & echo;%%a
- )
- )>a_.txt
- start a_.txt
复制代码
作者: johnson3333 时间: 2009-6-17 18:50
这个▓ 是什么?怎么打出来?现在已经可以了,老兄你真强,我看都看不懂,你给我推荐下学习bat的教程好么?非常感谢。
作者: zjw767676 时间: 2009-6-17 22:04
▓可以换成别的不常用的字符,作用是一样的!
作者: tireless 时间: 2009-6-17 22:52
eol=▓ 是忽略以 ▓ 开头的行,默认是 eol=;。可以用 alt+9619(小键盘)打出这个字符。
推荐:
http://bbs.verybat.org/thread-1192-1-1.html
CMD/DOS下符号的作用参考 http://www.cn-dos.net/forum/viewthread.php?tid=30985
什么情况下该使用变量延迟? http://www.cn-dos.net/forum/viewthread.php?tid=20733
简析环境变量和变量延迟特殊字符以及中介法的微妙关系 http://www.cn-dos.net/forum/viewthread.php?tid=30884
[ 本帖最后由 tireless 于 2009-6-17 23:00 编辑 ]
作者: johnson3333 时间: 2009-6-18 11:00 标题: 回复 9楼 的帖子
非常感激~~谢谢你,我把你的代码贴到其他地方去了,注明了作者是你,这个代码能帮到很多人。
作者: 随风 时间: 2009-6-18 11:16
re 楼主
问题解决了,可以把标题加上 [以解决] 字样吗?
作者: keen 时间: 2009-6-18 11:25
tireless兄,我看了你的2楼和6楼的代码,我发现两个代码除了eol=▓不同,还有就是给%%a前加了个#号,正因为此处加了#号,6楼的代码就可以去掉重复的行,而2楼的就不行。
我仔细研究后,发现是因为a.txt中的文本含有^^的行前面有空格导致的,要是把含有^^的行的前面的空格去掉,2楼的代码也可以去掉重复行。
这点让我很不明白,为什么空格会影响结果,其中缘由望tireless兄赐教!
作者: 随风 时间: 2009-6-18 12:13 标题: 回复 12楼 的帖子
if defined str
上句,是判断 str 是否被定义,那么如果要判断 空格空格空格str 呢?该如何?
if defined str 这样吗?肯定是不行的,但是给他加个前缀就ok了
if defined # str 当然这只是个例子便于理解,实际中defined 不能这样用空格,具体的有分析过,搜索 defined 。
作者: inittab 时间: 2009-6-18 12:48
下面这个例子能说明问题:
set a=b
set a=b
set # a=b
前两句其实都是一样的。加再多的空格还是相当于set a=b, 针对楼主的帖子来说。行前面带没带空格就不能够区分开了。
第三句加个#就不一样了,它变为另一个变量"# a“了。就可以区分开了
作者: keen 时间: 2009-6-18 16:30
感谢随风兄和inittab兄,已经明白了!
作者: johnson3333 时间: 2009-6-24 17:52
set #%%a= & echo;%%a
tireless兄请问这句怎么解释,这句我看不懂。
[ 本帖最后由 johnson3333 于 2009-6-24 17:57 编辑 ]
作者: keen 时间: 2009-6-24 19:24 标题: 回复 16楼 的帖子
set #%%a= &echo;%%a
意思是给变量#%%a赋值为空格,并且显示%%a里面的值。
作者: johnson3333 时间: 2009-6-24 22:22
谢谢楼上
tireless兄,在你的帮助下你的代码看了几天我基本上看明白了,还有一个问题:请问eol=▓这个是忽略▓开头的字符串,这句放在这里有什么深意呢?
[ 本帖最后由 johnson3333 于 2009-6-24 22:23 编辑 ]
作者: keen 时间: 2009-6-24 22:32 标题: 回复 18楼 的帖子
▓这个符号一般不常用,eol=▓它的意思就是忽略以▓这个符号开头的行,但是任何文本中可能都没有以▓这个符号开头的行,所以反过来想,就是不忽略任何行。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |