Board logo

标题: [文本处理] [已解决]批处理如何删除连续重复行,只保留显示一行? [打印本页]

作者: pengli0108    时间: 2012-12-17 10:23     标题: [已解决]批处理如何删除连续重复行,只保留显示一行?

需求如题目,
如本身数据为:
a 1
a 1
b 2
c 3
c 3
a 1
期望其转化的结果是:
a 1
b 2
c 3
a 1
一直没想明白这个算法的实现,用bat
还请高人指点迷津,多谢多谢
作者: apang    时间: 2012-12-17 12:54

  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in (a.txt) do (
  3.    if "!str!" neq "%%a" echo,%%a
  4.    set "str=%%a"
  5. ))>b.txt
复制代码

作者: BAT-VBS    时间: 2012-12-17 18:28

  1. uniq a.txt >b.txt
复制代码

作者: pengli0108    时间: 2012-12-26 15:49

回复 2# apang


    有一个追问

我的test文件是这样的

414.08        2012-10-10 10:10        0
414.08        2012-10-10 10:10        0
414.08        2012-10-10 10:10        0
414.08        2012-10-10 10:10        0
414.08        2012-10-10 10:10        0
414.08        2012-10-10 10:10        0
414.08        2012-10-10 10:10        0
414.08        2012-10-10 10:10        0
414.08        2012-10-10 10:10        0
414.08        2012-10-10 10:10        0
414.08        2012-10-10 10:10        0
414.08        2012-10-10 10:11        0

我的代码是
  1. @echo off & setlocal enabledelayedexpansion
  2. cd.>new.txt
  3. for /f "tokens=1,2,3,4 delims= " %%a in (test.txt) do (
  4.    if !str! neq %%a set str=%%a&echo %%a >>new.txt
  5. )
复制代码
运行后
输出是:
414.08        2012-10-10

为何我的echo 只设置了一个%%a,他会给我出来两列?觉得比较困惑


多谢了哈
作者: apang    时间: 2012-12-26 16:26

本帖最后由 apang 于 2012-12-26 16:32 编辑

回复 4# pengli0108


    第一列与第二列之间不是空格,而是跳格(Tab)?
话说只比较第一列的话,for /f %%a in (test.txt) do ...
即tokens和delims 可以省略
作者: pengli0108    时间: 2012-12-26 17:09

回复 5# apang


    这个我也不太清楚第一列与第二列的数据间隔是什么,数据是从excel里边copy过来的

   其实去掉重复行的需求我已经满足了,只是很疑惑为何输出会是一个%%a,就有两列,其实我是四列都要,但是我只需要三个参数%%a,%%b,%%c而不是四个。
作者: BAT-VBS    时间: 2012-12-26 21:41

回复 6# pengli0108


    把那个txt文件压缩一下,传上来看看。
作者: pengli0108    时间: 2013-1-2 16:32

回复 7# BAT-VBS


    好的,已经贴上去了,麻烦看看,让后生多多学习。
作者: BAT-VBS    时间: 2013-1-2 20:45

回复 8# pengli0108


试试这个
作者: pengli0108    时间: 2013-1-7 09:57

回复 9# BAT-VBS


    好用了,但是不太明白其中的原由。我看了下,确实我之前的数据之间可能有的是空格,有的是TAb隔开的。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1,2,3,4 delims= " %%a in (test.txt) do (
  4.     if "!str!" neq "%%a" (
  5.         set "str=%%a"
  6.         echo,%%a---%%b---%%c---%%d
  7.     )
  8. ))>new.txt
复制代码
中间if "!str!" neq "%%a" 为何两边都加引号,还有内部的set "str=%%a"
不是很清楚这块儿

谢谢哈,麻烦你了。多谢
作者: BAT-VBS    时间: 2013-1-7 10:12

回复 10# pengli0108


    为了防止字符串里面有特殊字符的时候代码出错




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2