Board logo

标题: [文本处理] [已解决]如何用批处理命令从文本中取出想要的行? [打印本页]

作者: 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

  1. @echo off
  2. (
  3.   for /f "delims=" %%a in ('findstr /c:"^^" c:\a.txt') do (
  4.     if not defined %%a set %%a= & echo;%%a
  5.   )
  6. )>a_.txt
  7. 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楼 的帖子

改成这样:
  1. @echo off
  2. (
  3.   for /f "eol=▓ delims=" %%a in ('findstr /c:"^^" a.txt') do (
  4.     if not defined #%%a set #%%a= & echo;%%a
  5.   )
  6. )>a_.txt
  7. 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://bbs.bathome.net/) Powered by Discuz! 7.2