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

[文本处理] [已解决]批处理怎样清除文本重复行,保留文本中最后一个重复行

[复制链接]
发表于 2014-9-26 14:13:52 | 显示全部楼层 |阅读模式
本帖最后由 nai 于 2014-9-26 18:13 编辑

怎样清除文本重复行,保留文本中最后一个重复行,其它没有重复的行也保留
如:

123456789
abcdefg
123456789
5566
abcd
cccccccccc
123456789
abcd



结果:

abcdefg
5566
cccccccccc
123456789
abcd

发表于 2014-9-26 15:03:04 | 显示全部楼层
  1. @echo off
  2. (for /f "delims=" %%a in ('sort /+65535 a.txt') do (
  3.         if not defined _%%a set "_%%a=1" & echo,%%a
  4. ))>$
  5. sort /+65535 $ /o b.txt
  6. pause
复制代码
 楼主| 发表于 2014-9-26 15:39:53 | 显示全部楼层
回复 2# apang
效果是可以了,就是会多一个“$”没有扩展名的文件
 楼主| 发表于 2014-9-26 15:41:03 | 显示全部楼层
回复 2# apang

谢谢
发表于 2014-9-26 16:06:44 | 显示全部楼层
本帖最后由 牛虻 于 2014-9-26 16:08 编辑

回复 3# nai


    在倒数第二行加一行
Del $
你也可以把$ 改为 $.txt 看看里面是什么
发表于 2014-9-26 16:11:27 | 显示全部楼层
回复 2# apang


    我想用For循环来做,但是一下午没写出来
帮帮我呗!!!
发表于 2014-9-26 16:13:32 | 显示全部楼层
来两个 js+bat
  1. @set @bathome=1/*&echo off
  2. cscript -nologo -e:jscript "%~0" <a.txt
  3. pause&exit /b */

  4. var text = WScript.StdIn.ReadAll().split(/[\r\n]+/g)
  5. var i, j, object = {}, array = []

  6. for(i=text.length;i--;){
  7.         var flag=true
  8.         for(j in array){
  9.                 if(text[i]===array[j]){
  10.                         flag=false
  11.                         break
  12.                 }
  13.         }
  14.         if(flag)array.unshift(text[i])
  15. }

  16. WScript.Echo(array.join('\r\n'))
复制代码
  1. @set @bathome=1/*&echo off
  2. cscript -nologo -e:jscript "%~0" <a.txt
  3. pause&exit /b */

  4. var text = WScript.StdIn.ReadAll().split(/[\r\n]+/g)
  5. var i, object = {}, array = []

  6. for(i in text)object[text[i]]=i
  7. for(i in object)array.push({index:object[i],string:i})
  8. array = array.sort(function(a,b){return a.index-b.index})

  9. for(i in array)WScript.Echo(array[i].string)
复制代码
发表于 2014-9-26 21:05:52 | 显示全部楼层
回复 6# 牛虻


    有什么大体思路吗?碰到哪些障碍?
发表于 2014-9-26 21:54:35 | 显示全部楼层
回复 7# CrLf


    这次处理用纯批有什么不妥吗……
发表于 2014-9-26 22:32:14 | 显示全部楼层
本帖最后由 523066680 于 2014-9-26 22:41 编辑

很久没写了, 见笑

[size=1.1em]@echo off
setlocal enabledelayedexpansion
set /a i=0
for /f %%a in (src.txt) do (
        set /a i+=1
        set Line!i!=%%a
)

for /l %%a in (%i%, -1, 1) do (
        set /a j = i - %%a + 1
        if defined def[!Line%%a!] (
                set Line%%a=
                echo 剔除行 %%a
        ) else (
                set /a def[!Line%%a!] = 1
        )
)
echo,
echo 结果:
for /l %%a in (1, 1, %i%) do (
        if defined Line%%a (
                echo !Line%%a!
        )
)
pause
发表于 2014-9-26 22:33:52 | 显示全部楼层
本帖最后由 CrLf 于 2014-9-26 22:34 编辑

回复 9# 523066680


没什么不妥,要挑剔的话就是不支持含 = 的文本,不过这不是大问题,好吧我承认就是手痒而已...


回复 10# 523066680


是贱笑吧
还有,记得加 [ code]
发表于 2014-9-26 22:36:47 | 显示全部楼层
本帖最后由 523066680 于 2014-9-26 22:40 编辑

回复 11# CrLf


      抓个彩色过来,好像配色有点蛋疼,嚯,早先没有看到apang的代码,好简短。
s/见笑/献丑/;
发表于 2014-9-27 19:29:35 | 显示全部楼层
来一枚 php:
  1. php -r "echo join(array_reverse(array_unique(array_reverse(file('a.txt')))));">b.txt
复制代码
好像有点杀鸡用牛刀的说
如果缺少 php.exe,可踹到这里下载
发表于 2014-9-27 19:33:16 | 显示全部楼层
再来一枚 bat,通用性<2楼<10楼,但运行效率得反过来,娱乐娱乐:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=|"
  3. for /f "delims=" %%a in (a.txt) do (
  4.         set "str=!str:|%%a|=|!%%a|"
  5. )
  6. echo !str:^|=^

  7. !
  8. pause
复制代码
发表于 2014-9-28 10:14:53 | 显示全部楼层
回复 8# CrLf


    我想用for把读到的第一行和除了第一行的所有行比较,相等就删掉,不等就继续用第二行和除第一、第二行的所有行比较,以此类推
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-21 00:29 , Processed in 0.034472 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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