Board logo

标题: [文本处理] [已解决]求助批处理相同行删除,不同行只保留一个 [打印本页]

作者: jrx401    时间: 2019-10-10 18:27     标题: [已解决]求助批处理相同行删除,不同行只保留一个

本帖最后由 jrx401 于 2019-10-22 11:30 编辑

详细如下;
a.txt内容;
11111
11111
11112
A1111
11111
CCCCC
11111

a.txt处理后;
11111
11112
A1111
CCCCC

如下code是可以处理,但是A.txt里面有几千行时,就非常耗时。
可否有快速处理的方法呢?

使用的code;
  1. setlocal enabledelayedexpansion
  2. set n=0
  3.   for /f %%a in (A.txt) do (
  4.     set /a n=!n!+1
  5.     set m=0
  6.     set write=1
  7.     for /f %%b in (A.txt) do (
  8.       set /a m=!m!+1
  9.       if !m! lss !n! (
  10.         if %%a == %%b ( set write=0 )
  11.     )
  12.   )
  13.   if !write! equ 1 echo %%a >> result.txt
  14. )
复制代码
感谢各位大虾
作者: ivor    时间: 2019-10-10 19:40

  1. powershell "(gc 'a.txt' | sort -Unique) | Out-File a.txt"
复制代码

作者: Batcher    时间: 2019-10-10 21:32

  1. gawk "!a[$0]++" "a.txt" > "b.txt"
复制代码
推荐试试第三方命令行工具 gawk 处理速度比较快
http://bcn.bathome.net/s/tool/index.html?key=gawk
作者: jrx401    时间: 2019-10-12 18:02

回复 2# ivor


    感谢大侠回复。
     使用Powershell 就无法把bat 转成exe档。
     可否有好的方法转档成exe呢?

     衷心感谢
作者: jrx401    时间: 2019-10-12 18:03

回复 3# Batcher


    感谢大侠回复。
    不是很会用,使用gewk后的bat 可否也可以转成 exe呢?

    衷心感谢
作者: jrx401    时间: 2019-10-12 18:06

感谢两位回复。
一直想办法使用bat来写看看,
发现改成如下,就变得比较快了
   for /f "tokens=1,2 delims= " %%c in (A.txt) do (   
    findstr /c:"%%c" B.txt>nul||echo %%c>>B.txt
   )
pause
作者: Batcher    时间: 2019-10-12 18:18

回复 6# jrx401


这样应该可以再快点
  1. (for /f "tokens=1,2 delims= " %%c in (A.txt) do (
  2.     findstr /c:"%%c" B.txt>nul||echo %%c
  3. ))>B.txt
复制代码

作者: terse    时间: 2019-10-13 21:19

文件不是很大的话 这样提高点效率
  1. @echo off&SetLocal EnableDelayedExpansion
  2. (for /f "delims=" %%a in (a.txt) do (
  3.     if "!%%a!"=="" (
  4.         echo %%a
  5.         set %%a=0
  6.     )
  7. ))>b.txt
  8. pause
复制代码

作者: jrx401    时间: 2019-10-22 11:26

回复 7# Batcher


    感谢大虾。
    比我的快 5s 。
    四千行的数据
    万分感激
作者: jrx401    时间: 2019-10-22 11:28

回复 8# terse


      高手!!!
     秒杀[四千行,1s 结束]
     不是很理解,为什么可以这样快。
      万分感激
作者: wxyz0001    时间: 2019-10-25 12:53

本帖最后由 wxyz0001 于 2019-10-25 18:20 编辑

回复 1# jrx401
答案很浅显易懂
不过程序似乎多用了些废功夫,第二个for中,当 if %%a == %%b ( set write=0 )这个条件满足时,好像没有设置跳出循环,你们说是不是多走了些无用功
作者: wxyz0001    时间: 2019-10-25 12:56

回复 8# terse

代码短,也很精辟,赞
作者: xczxczxcz    时间: 2019-10-26 16:20

4000行 1S ?那 22000000多行 4s内完成 又如何?




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