[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 nai 于 2014-9-26 18:13 编辑

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

123456789
abcdefg
123456789
5566
abcd
cccccccccc
123456789
abcd



结果:

abcdefg
5566
cccccccccc
123456789
abcd

  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
复制代码

TOP

回复 2# apang
效果是可以了,就是会多一个“$”没有扩展名的文件

TOP

回复 2# apang

谢谢

TOP

本帖最后由 牛虻 于 2014-9-26 16:08 编辑

回复 3# nai


    在倒数第二行加一行
Del $
你也可以把$ 改为 $.txt 看看里面是什么
菩提本无树,明镜亦非台。
本是无一物,何处惹尘埃。

TOP

回复 2# apang


    我想用For循环来做,但是一下午没写出来
帮帮我呗!!!
菩提本无树,明镜亦非台。
本是无一物,何处惹尘埃。

TOP

来两个 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)
复制代码

TOP

回复 6# 牛虻


    有什么大体思路吗?碰到哪些障碍?

TOP

回复 7# CrLf


    这次处理用纯批有什么不妥吗……

TOP

本帖最后由 523066680 于 2014-9-26 22:41 编辑

很久没写了, 见笑

@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

TOP

本帖最后由 CrLf 于 2014-9-26 22:34 编辑

回复 9# 523066680


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


回复 10# 523066680


是贱笑吧
还有,记得加 [ code]

TOP

本帖最后由 523066680 于 2014-9-26 22:40 编辑

回复 11# CrLf


      抓个彩色过来,好像配色有点蛋疼,嚯,早先没有看到apang的代码,好简短。
s/见笑/献丑/;

TOP

来一枚 php:
  1. php -r "echo join(array_reverse(array_unique(array_reverse(file('a.txt')))));">b.txt
复制代码
好像有点杀鸡用牛刀的说
如果缺少 php.exe,可踹到这里下载

TOP

再来一枚 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
复制代码

TOP

回复 8# CrLf


    我想用for把读到的第一行和除了第一行的所有行比较,相等就删掉,不等就继续用第二行和除第一、第二行的所有行比较,以此类推
菩提本无树,明镜亦非台。
本是无一物,何处惹尘埃。

TOP

返回列表