中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-26 00:39
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 怎么去除TXT文件中重复的行 查看 7,617 回复 22
16 发表于 2006-09-13 23:58 ·  中国 河南 郑州 电信
中级用户
★★
积分 439
发帖 170
注册 2006-01-09 20:29
20年会员
UID 48707
状态 离线
Originally posted by willsort at 2006-9-13 23:25:
Re a9319751『第 11 楼』:

很抱歉,我的操作失误给你带来了负面影响,对此我郑重表示道歉!

现已对原处理方式作出纠正,望周知。


willsort斑竹这么客气啊
17 发表于 2006-09-14 00:20 ·  中国 甘肃 张掖 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
Originally posted by namejm at 2006-9-13 12:01:
  如果楼主只是想把重复N次的行打印一次,并且无须保持行的相对位置不变的话,可以参考bagpipe曾经写过的一段代码:

  
写的很好
18 发表于 2006-09-26 07:28 ·  中国 北京 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
俺觉得要是想挑出唯一的电子邮件地址,在数千个行里,每行一个邮件地址。
或是,要挑出数千行里必须唯一的电话号码,
那么,其实可以象开玩笑的这么玩好玩~:)


@echo off

REM 却掉重复的行,按原顺序只留唯一
REM 用于挑出唯一命令、用于在让搜索到的电子邮件地址的唯一不重复性
REM 如果是含有批处理禁忌的特殊符号就算了,它就适合于上面功能。

REM ============== S.bat ======================
REM 请将需要唯一不重复行的数据存成 dat.txt 文件名即可
REM  以防止万一,自己建立的目录你自己删吧~:)




md redtek
for /f "tokens=*" %%a in (dat.txt) do (
md redtek\^"%%a^"
)

dir /b /od redtek\ > Ok.txt
Notepad.exe Ok.txt






这个是要挑出唯一性的模拟内容,可以存成 Dat.txt 文件与上面方法一试:)

dos
china
bat
redtek@sweetmeet.com
dos
china
bat
Redtek@sweetmeet.com
dos
china
bat
com
mco
comm
comm on
redtek@sweetmeet.com
on commm
com on mmn
comm ono
bta
bat b
2006
2006 12
2006.12.2006








其实,谁让DOS建目录的时候不能建重名的目录名啊,哈哈……
那规则既然被定好了,我们就利用DOS建目录不能重名,
所以,有重名的系统自然会提示说什么什么,

但是!!它是建不上一个重名的目录的,哈哈……
所以,DIR加参数只列文件名,然后按照我建立目录的时间来排序,
当然就是具有唯一性了。

不好意思,这是个开玩笑的玩法,不能用在别的有用的地方,权当大家笑笑开开心~:)

[ Last edited by redtek on 2006-9-26 at 07:31 ]
19 发表于 2006-09-26 13:15 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  楼上的方法虽然巧妙,但是却有很大的局限性:

  首先,文件名的长度有限制,在XP的NTFS格式的分区中,最长的路径不能超过256个字符,除掉盘符、冒号和斜杠,只剩下最多253个字符的长度能做文件名,所以,当某行的字符数超过253的时候,你的代码就会出错;

  其次,文件名中不能再出现冒号及一些特殊字符,如果文本中正好出现这些字符的话,代码同样会出错;当然,前面的那些代码同样不能处理敏感字符,但是至少还是可以处理冒号的;

  最后,你创建了那么多的文件夹,临时文件的数量够吓人的,呵呵,最后还要删除它,给人的感觉很不爽啊。

  当然,你说过了,这个只是弄来玩玩的,我们也就当做是在做智力体操,拓展思维,博众人一笑吧^_^

[ Last edited by namejm on 2006-9-26 at 13:17 ]
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
20 发表于 2006-09-26 20:24 ·  中国 北京 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
多谢namejm指点,哈哈~:)
21 发表于 2006-12-22 08:09 ·  中国 河南 郑州 电信
中级用户
★★
积分 439
发帖 170
注册 2006-01-09 20:29
20年会员
UID 48707
状态 离线
其实当初我想用这个处理QQ聊天的记录,中间可能有很多重复的,我想把多余的部分删掉,剩下按顺序排列
bat c c++
22 发表于 2006-12-25 11:37 ·  中国 辽宁 本溪 联通
银牌会员
★★★
积分 1,212
发帖 464
注册 2006-12-13 21:11
19年会员
UID 73417
性别 男
状态 离线
'功能:删除某个文件中内容相同的行,但保留内容相同的最上面的一行。
'弊端:效率太低。处理文件不要太大,请测试后使用。
'使用方法:将下面的内容复制到记事本另存为a.vbs之后把要处理的文件拖放到a.vbs上面即可。

starttime=timer
on error resume next
set fso=createobject("scripting.filesystemobject")
set fd=fso.getfile(Wscript.Arguments(0))
set file=fso.opentextfile(Wscript.Arguments(0),1)
Do while not(file.AtEndOfStream)
n = n + 1
tmp = file.readline
ReDim Preserve temp(n-1)
temp(n-1)= tmp
loop
file.Close
For x=0 to n-1
For y= 1 to n-1
If x <> y Then
If temp(x) =temp (y) And x < y Then
temp(y)="{059F6FBC-10FB-4FBC-BCF7-DB362A3DB1DB}"
End If
End If
Next
Next

For x=0 to n-1
if temp(x)<>"{059F6FBC-10FB-4FBC-BCF7-DB362A3DB1DB}" then S= S & temp(x) & vbcrlf
Next
Set file = fso.OpenTextFile(Wscript.Arguments(0), 2, True)
file.write S
file.Close
endtime=timer
yongshi=cdbl(endtime-starttime)
msgbox "已经将" & fd.name & "文件里相同行的内容删除,用时" & Round(yongshi,2) & "妙。" & vbcrlf & "(保留了相同行内容的最上面的一行!)" ,48+4096,"操作完成"
set fso=nothing
set fd=nothing
set file=nothing


[ Last edited by jmz573515 on 2006-12-26 at 09:44 AM ]
23 发表于 2007-04-10 05:29 ·  中国 浙江 阿里云BGP节点
新手上路
积分 10
发帖 4
注册 2007-03-07 04:23
19年会员
UID 80960
性别 男
状态 离线
@echo off
setlocal
if (%1)==() goto end
REM sort/r <%1 >tmp.txt 逆序
sort <%1 >tmp.txt
set "a="&(set b=)
type nul>sss.txt
for /f "delims=" %%a in (tmp.txt) do call :hehe "%%a"

del tmp.txt
set "a="&(set b=)
echo 完成
goto :eof

:hehe
set a=%b%
set b=%~1
if not "%a%"=="%b%" echo %b% >>sss.txt
goto :eof


:end
echo 对不起,参数错误!!!

请教下怎么按每行的字符数排列
论坛跳转: