如题,可以用DOS命令实现吗?
FC ?
FC ?
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!
dos
china
dos
dos
bat
dos
dos
china
bat
dos
china
bat
dos
china
bat
@echo off
:: mode con lines=25
:: 解决问题的思路:
:: 比较相邻三行的内容
:: 如果前两行内容相等,并且与第三行不相等,则取第二行的内容放入repetition.txt
:: 如此循环
:: 跳出for之后
:: 如果最后一行和倒数第二行内容相等,则把最后一行内容放入repetition.txt
:: 最后,用for从repetition.txt中逐行读出信息,在原文件中把这些信息过滤掉
:: 行首的空格将被忽略,空行将不被删除(且不纳入统计数据)
:: 效率惊人地高
:: 不能处理的符号有:
:: 管道符号:|
:: 连接符号:&、&&、||
:: 重定向符号:<、<<、>、>>
:: 转义符号:^
:: 其他字符:"、;、:、\(但是在行首是可以的)
:: 弊端:
:: findstr不能搜索过长的字符串(长度是多少?)
:: Code by JM,Thanks to NaturalJ0
:: build on 2006-9-4~2006-9-
:: 还要完善或者开发的功能:
:: 对无用的临时文件的处理;统计被过滤的行数;操作时的提示;适应各种文件名;
cls
title 相同行内容过滤器-处理中...
call :blank
call :blank
echo 正在处理,请耐心等待...
:: 做程序开始时间标记
set time_begin=%time:~0,-3%
for /f "tokens=1,2,3 delims=:" %%i in ("%time_begin%") do (
set /a hour_b=%%i
set /a munite_b=%%
set /a second_b=%%
)
set lines_total=0
set count_same=0
>sort.txt sort<test.txt
cd.>repetition.txt
setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (sort.txt) do (
set first=!second!
set second=!third!
set third=%%i
set /a lines_total+=1
call :comp_
)
:: 当%second%未取到值的时候,要避免repetition.txt记录echo的状态
if not "%second%"=="" if "%second%"=="%third%" >>repetition.txt echo %third%&& set /a count_same+=1
:: 没有重复内容则不对原文件作过滤处理
findstr . repetition.txt>nul||(del /q repetition.txt & goto :result)
copy test.txt test.bak>nul
for /f "tokens=*" %%i in (repetition.txt) do (
findstr /v "\<%%i\>" test.txt>>tmp.txt
del /q test.txt
ren tmp.txt test.txt
)
:result
for /f "tokens=*" %%i in (test.txt) do (
set /a lines_spare+=1
)
if "%lines_spare%"=="" set lines_spare=0
:: 当文本内容超过3行,且存在用相同个数的空格为内容的行时
:: repetition.txt会记录echo的状态,会导致统计不准确
:: 所以还要用通过比较处理前后行数是否相同来校正统计数据
if "%lines_total%"=="%lines_spare%" (del /q repetition.txt&set count_same=0)
set /a lines_del=%lines_total%-%lines_spare%
cls
title 相同行内容过滤器-过滤结果
call :blank
echo ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
echo 原文件共有 %lines_total% 行;共有 %count_same% 条重复记录.(未计算空行)
echo 处理后的文件还剩 %lines_spare% 行.(未计算空行)
echo 被删除的内容总计 %lines_del% 行
rem ======计算花费的时间========
set time_end=%time:~0,-3%
for /f "tokens=1,2,3 delims=:" %%i in ("%time_end%") do (
set /a hour_e=%%
set /a munite_e=%%j
set /a second_e=%%k
)
call :time_lapse
echo 耗时: %hour_% 小时 %munite_% 分 %second_% 秒.
echo.
echo test.txt为处理后的文件;test.bak为原始文件的备份
echo sort.txt为原始文件内容的排序文件,你可以很方便地
echo 查看文本内容重复与否及重复情况;
echo repetition为重复行的内容,升序排列;若原始文本没
echo 有重复行,则此文件不存在.
echo ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
call :blank
echo 按任意键退出...
pause>nul
goto :eof
:comp_
:: 当%second%或者三个变量全都取到空值的时候,要避免repetition.txt记录echo的状态
if not "%first%"=="" (
if not "%second%"=="" (
if "%second%"=="%first%" (
if not "%second%"=="%third%" >>repetition.txt echo %second%&& set /a count_same+=1
)
)
)
goto :eof
rem =====计算运行程序花费的时间========
:time_lapse
:: 一定要按照 秒=>分钟=>小时 的顺序操作
if %second_e% lss %second_b% (
set /a munite_e=%munite_e%-1
set /a second_e=%second_e%+60
)
set /a second_=%second_e%-%second_b%
if %munite_e% lss %munite_b% (
set /a hour_e=%hour_e%-1
set /a munite_e=%munite_e%+60
)
set /a munite_=%munite_e%-%munite_b%
if %hour_e% lss %hour_b% (
set /a hour_e=%hour_e%+24
)
set /a hour_=%hour_e%-%hour_b%
goto :eof
:blank
echo.
echo.
echo.
echo.
goto :eof
Originally posted by he200377 at 2006-9-6 03:13:
假如你的文件是 a.txt
cd.>a_temp.txt
for /f "tokens=1 delims=," %%i in (a.txt) do (find a_temp.txt "%%i" && echo.>nul||echo %%i>>a_temp.txt)
生栮..
Originally posted by willsort at 2006-9-13 23:25:
Re a9319751『第 11 楼』:
很抱歉,我的操作失误给你带来了负面影响,对此我郑重表示道歉!
现已对原处理方式作出纠正,望周知。
Originally posted by namejm at 2006-9-13 12:01:
如果楼主只是想把重复N次的行打印一次,并且无须保持行的相对位置不变的话,可以参考bagpipe曾经写过的一段代码:
写的很好
@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
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 ]
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