找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 38493|回复: 12

[文本处理] [已解决]BAT如何去除文件中重复的行

[复制链接]
发表于 2014-1-17 12:44:28 | 显示全部楼层 |阅读模式
本帖最后由 chuyizhou 于 2014-1-20 08:48 编辑

大家好!新手又来提问了!

这次想问的也很简单很基础,就是如何去除文件中重复的行,只保留一个。

打比方有一个文件a.txt,它的内容如下,经过处理之后,像aaa,bbb这种就只留一个就行
aaa
bbb
ccc
aaa
ddd
bbb
eee

我的思路是:先读取文件内容,将第一行的值给%a%,同时删除这一行,用%a%查找剩余行,发现没有匹配的,那么将%a%添加到最后,如果发现有匹配的那么就马上读取下一行。

但写的时候发现问题多多,没办法只好求助大家!我的思路只是给大家一个参考,它其实是会无限循环下去的,我也不知道怎么让它识别文件读没读完,查了好些资料都没头绪,主要还是基础太差~

note: 希望代码可以兼容 点 .      下划线 _   这两个字符(至少兼容这两个)

先谢谢大家了!

其实这几天还一直在研究FTP相关的命令,但是发现公司的ftp特别难搞,其实我只是想测试这几个ftp能不能进去而已,查了好些资料也不得要领,如果大家手头上有教程连接的话不胜感激~!

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2014-1-17 13:02:04 | 显示全部楼层
  1. @echo off
  2. (for /f "delims=" %%i in (a.txt) do (
  3.     if not defined %%i (
  4.         echo,%%i
  5.         set %%i=1
  6.     )
  7. ))>b.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
BHsolve + 1 厉害,变量还可以这么用。 我以前怎么没有 ...

查看全部评分

 楼主| 发表于 2014-1-17 14:07:12 | 显示全部楼层
回复 2# DAIC


   大校,能稍微解释一点吗?这段很简洁也确实能用,能用aaa作为例子说一下处理时候的逻辑吗?谢谢啦~
发表于 2014-1-17 14:10:25 | 显示全部楼层
回复 3# chuyizhou


判断aaa这个变量是否被定义过
1、如果没有被定义过,输出该行,定义一下
2、如果已经被定义过,说明是重复行,跳过
 楼主| 发表于 2014-1-17 19:04:10 | 显示全部楼层
回复 4# DAIC


    有点犀利啊。没有else就是跳过的意思吗?
发表于 2014-1-17 19:38:36 | 显示全部楼层
回复 5# chuyizhou
  1. if 我买了一注双色球彩票 (
  2.     我的钱减少了两块
  3. )
复制代码
这里虽然没有else,但是没有买彩票的话,很显然不会减少两块钱。
 楼主| 发表于 2014-1-17 21:33:48 | 显示全部楼层
回复 6# DAIC


    恩,懂了。没想到if在这里还能够这样用,我还以为if defined str是看str有没有值,其实在你的代码中%%i是有值的对吧,一开始是aaa,但其实并没有被define过。

请教一下,被set过的字符串才算是defined的吗?
发表于 2014-1-20 09:41:58 | 显示全部楼层
回复 7# chuyizhou


    是的
发表于 2014-1-21 20:35:44 | 显示全部楼层
回复 8# DAIC
请问下set %%i=1,这个1代表什么意思呢?新手不太懂哈~
发表于 2014-1-21 20:59:18 | 显示全部楼层
回复 9# directorlin

只是说明定义过,至于等于任何数字都无所谓
发表于 2014-1-23 20:34:45 | 显示全部楼层
回复 2# DAIC

我把代码改为:
    @echo off
(for /f "delims=" %%i in (*.txt) do (
    if not defined %%i (
        echo,%%i
        set %%i=1
    )
))>b.txt

为什么除了以a为文件名的a.txt文本文件外,其他文件名的文本文件不可以呀?
错在哪里?
发表于 2014-1-23 23:58:31 | 显示全部楼层
回复 11# wenlishasha
这里的 *.txt 用法错误
 楼主| 发表于 2014-1-24 10:06:15 | 显示全部楼层
回复 11# wenlishasha


    我猜是for语句无法理解你的这个(*.txt)的意思吧?如果你想把当前目录下所有的txt文件的内容给去除重复行,我猜可能要用嵌套的语句了。
  1. @echo off

  2. for /f %%i in ('dir *.txt') do (
  3. for /f %%a in (%%i) do (
  4.      if not defined %%a (
  5.                echo %%a
  6.                set %%a=1)
  7.      )
  8. )
复制代码
这个我随手写的也没测试过,不过大概就是这个意思吧。如果有问题的话希望高手将我改正!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 06:17 , Processed in 0.016246 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表