标题: [文本处理] [已解决]批处理怎样清除文本重复行,保留文本中最后一个重复行 [打印本页]
作者: nai 时间: 2014-9-26 14:13 标题: [已解决]批处理怎样清除文本重复行,保留文本中最后一个重复行
本帖最后由 nai 于 2014-9-26 18:13 编辑
怎样清除文本重复行,保留文本中最后一个重复行,其它没有重复的行也保留
如:
123456789
abcdefg
123456789
5566
abcd
cccccccccc
123456789
abcd
结果:
abcdefg
5566
cccccccccc
123456789
abcd
作者: apang 时间: 2014-9-26 15:03
- @echo off
- (for /f "delims=" %%a in ('sort /+65535 a.txt') do (
- if not defined _%%a set "_%%a=1" & echo,%%a
- ))>$
- sort /+65535 $ /o b.txt
- pause
复制代码
作者: nai 时间: 2014-9-26 15:39
回复 2# apang
效果是可以了,就是会多一个“$”没有扩展名的文件
作者: nai 时间: 2014-9-26 15:41
回复 2# apang
谢谢
作者: 牛虻 时间: 2014-9-26 16:06
本帖最后由 牛虻 于 2014-9-26 16:08 编辑
回复 3# nai
在倒数第二行加一行
Del $
你也可以把$ 改为 $.txt 看看里面是什么
作者: 牛虻 时间: 2014-9-26 16:11
回复 2# apang
我想用For循环来做,但是一下午没写出来
帮帮我呗!!!
作者: CrLf 时间: 2014-9-26 16:13
来两个 js+bat- @set @bathome=1/*&echo off
- cscript -nologo -e:jscript "%~0" <a.txt
- pause&exit /b */
-
- var text = WScript.StdIn.ReadAll().split(/[\r\n]+/g)
- var i, j, object = {}, array = []
-
- for(i=text.length;i--;){
- var flag=true
- for(j in array){
- if(text[i]===array[j]){
- flag=false
- break
- }
- }
- if(flag)array.unshift(text[i])
- }
-
- WScript.Echo(array.join('\r\n'))
复制代码
- @set @bathome=1/*&echo off
- cscript -nologo -e:jscript "%~0" <a.txt
- pause&exit /b */
-
- var text = WScript.StdIn.ReadAll().split(/[\r\n]+/g)
- var i, object = {}, array = []
-
- for(i in text)object[text[i]]=i
- for(i in object)array.push({index:object[i],string:i})
- array = array.sort(function(a,b){return a.index-b.index})
-
- for(i in array)WScript.Echo(array[i].string)
复制代码
作者: CrLf 时间: 2014-9-26 21:05
回复 6# 牛虻
有什么大体思路吗?碰到哪些障碍?
作者: 523066680 时间: 2014-9-26 21:54
回复 7# CrLf
这次处理用纯批有什么不妥吗……
作者: 523066680 时间: 2014-9-26 22:32
本帖最后由 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
作者: CrLf 时间: 2014-9-26 22:33
本帖最后由 CrLf 于 2014-9-26 22:34 编辑
回复 9# 523066680
没什么不妥,要挑剔的话就是不支持含 = 的文本,不过这不是大问题,好吧我承认就是手痒而已...
回复 10# 523066680
是贱笑吧
还有,记得加 [ code]
作者: 523066680 时间: 2014-9-26 22:36
本帖最后由 523066680 于 2014-9-26 22:40 编辑
回复 11# CrLf
抓个彩色过来,好像配色有点蛋疼,嚯,早先没有看到apang的代码,好简短。
s/见笑/献丑/;
作者: CrLf 时间: 2014-9-27 19:29
来一枚 php:- php -r "echo join(array_reverse(array_unique(array_reverse(file('a.txt')))));">b.txt
复制代码
好像有点杀鸡用牛刀的说
如果缺少 php.exe,可踹到这里下载
作者: CrLf 时间: 2014-9-27 19:33
再来一枚 bat,通用性<2楼<10楼,但运行效率得反过来,娱乐娱乐:- @echo off&setlocal enabledelayedexpansion
- set "str=|"
- for /f "delims=" %%a in (a.txt) do (
- set "str=!str:|%%a|=|!%%a|"
- )
- echo !str:^|=^
-
- !
- pause
复制代码
作者: 牛虻 时间: 2014-9-28 10:14
回复 8# CrLf
我想用for把读到的第一行和除了第一行的所有行比较,相等就删掉,不等就继续用第二行和除第一、第二行的所有行比较,以此类推
作者: CrLf 时间: 2014-9-29 17:38
回复 15# 牛虻
看起来和 10 楼思路类似(但他进行了优化,用 if defined 代替 if equ),可以参考冒泡排序的算法,只要把排序改成除重就行了
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |