批处理数值排序问题_DOS/BAT

a.txt中有20行随机产生的数列,如下:
2928326128601232462131283250710027308938740594716691200992050511576
5352129649530193383124730478244772348721985707222557212265817305
217141333532296179938475175265792931789219830308392472584606305
2371620291160322081050531817416284225477019123161801285941026814244
283929972304551060318886921731765136928849135391662294051194618754
1809165929787147057932949630411324311737224509104016550662932273
27396236084901303873154718299242931819623155304661177528921164510335
254221462410491137971033914630292752245114969186002809930190939425
1085287492160525651862932475207612387312368408826675135332406418337
2567810118246621010283281198810903279355871571118961177731143829148
23727111515524141721964179351992331180134926914198081871053303186
378579502856625703213542353218420835730692264021219729654278515442
30215186011014395001656818458819061824708536511543271701327524725
223702764213159156022932717903282522044350522584222768193271431422354
3079720530119542370417125702274761144023302102641160114921224469221
15642298214000242538839193816839550322381321993212316517861828002
13042178002978222022331319116624809338275899045263351248023569
11252165681825711849278422768716060438517976169102391532289954712000
105084292396529699311371735329685626410510259482788519645152723476
29674179062831103792824121564178225289202161443911094228581583531951
要求通过纯批处理按照数列的大小顺序,正序输出如下:
13042178002978222022331319116624809338275899045263351248023569
217141333532296179938475175265792931789219830308392472584606305
1809165929787147057932949630411324311737224509104016550662932273
5352129649530193383124730478244772348721985707222557212265817305
15642298214000242538839193816839550322381321993212316517861828002
23727111515524141721964179351992331180134926914198081871053303186
30215186011014395001656818458819061824708536511543271701327524725
105084292396529699311371735329685626410510259482788519645152723476
254221462410491137971033914630292752245114969186002809930190939425
283929972304551060318886921731765136928849135391662294051194618754
378579502856625703213542353218420835730692264021219729654278515442
1085287492160525651862932475207612387312368408826675135332406418337
2371620291160322081050531817416284225477019123161801285941026814244
2567810118246621010283281198810903279355871571118961177731143829148
2928326128601232462131283250710027308938740594716691200992050511576
3079720530119542370417125702274761144023302102641160114921224469221
11252165681825711849278422768716060438517976169102391532289954712000
27396236084901303873154718299242931819623155304661177528921164510335
29674179062831103792824121564178225289202161443911094228581583531951
223702764213159156022932717903282522044350522584222768193271431422354
 
每行的数值都远远超过了cmd所能计算的最大数值。
要求,正确输出,不生成临时文件,代码高效通用。完成题目,视思路加分。
batman:
先说明下思路:
  此题确实是出给我们的一大难题,为什么这要说呢?楼主要求的是文本内所有超大数值的排序,
所有的数值都远远超过了cmd所能运算的最大数值,用常规的比较法都是行不通的这是难点之一;
第二这些数值是随机生成的且字符总数不定,甚至可能达到数行和数十行之长,如采用逐字符判断
的方法来确实行最大字符数,效率将会是此类方案所无法逾越的障碍;第三楼主要求不生成临时文
件,这对用findstr /o来获取行最大字符的方案来讲,无疑是锁上了大门。
  综上所述总结如下:
  代码要通用就要获取行最大字符数,一种方法是逐字符法,用逐字符法效率上就存在很大问题;
第二种方法是使用findstr /o一次性获取每行字符偏移量,再通过处理获得行最大字符数,效率上比
逐字符法是高多了,但因为单用findstr /o是不能获得文本行未行字符偏移量的,必须要对未行强加
回车,在不破坏原文件的情况下就要用到临时文件。
  而我们写代码时一般遵循四条原则:高效率、通用、简洁、尽量不生成临时文件,其中首要的
一条就是高效,其次是通用,至于简洁和有无临时文件都不是主要考虑因素,所以依此主次关系我
给出以下两种方案:
一、通用性差一点(数值字符都在一行内是绝对没问题的),效率高,代码简洁,无临时文件:
@echo off&setlocal enabledelayedexpansion
for /l %%i in (1,1,80) do set "kong=!kong!#"
for /f %%i in (1.txt) do (
set "str=%%i%kong%"
set "a=!str:~,80!"
set "a=!a:%%i=!"
set "_!a!%%i=a"
)
for /f "delims==_" %%i in ('set _') do (
set "str=%%i"
echo !str:#=!
)
pause>nul
二、通用性极高,效率一般,生成临时文件,代码较复杂:

复制代码 代码如下:

@echo off&setlocal enabledelayedexpansion
set "max=0"&set "a=0"
for /f %%i in (1.txt) do echo %%i>>2.txt
echo.>>2.txt
for /f "tokens=1,2* delims=:" %%i in ('findstr /n /o .* 2.txt') do (
set /a n+=1,m=n-1
set "num=%%i"&set "_!n!=%%j"&set "#%%i=%%k"
if !m! gtr 0 set /a a=_!n!-_!m!-2
if !max! lss !a! set "max=!a!"
)
set /a num-=1
for /l %%i in (1,1,%max%) do set "kong=!kong!#"
for /l %%i in (1,1,%num%) do (
set "str=!#%%i!%kong%"
set "a=!str:~,%max%!"
call,set "a=%%a:!#%%i!=%%"
set ".!a!!#%%i!=a"
)
for /f "delims==." %%i in ('set .') do (
set "str=%%i"
echo !str:#=!
)
del /q 2.txt&pause>nul

 
pusofalse:

复制代码 代码如下:

@echo off&setlocal enabledelayedexpansion
set m=0
for /f "tokens=1,* delims=:" %%a in ('findstr/o .* 1.txt') do (
set/a n+=1,l=n-1,y+=1
set ..!n!=%%a
set ##!y!=%%b
if !n! geq 2 (
call,set/a s=%%..!n!%%-%%..!l!%%-2,line+=1
call,set "_!s!=%%_!s!%%%%##!line!%% "
if !s! geq !m! set m=!s!
)
)
for /f "skip=1 delims=:" %%a in ('^(echo !##%y%!^&echo.^)^|findstr/o .*') do set/a final=%%a-3
call,set "_%final%=%%_!final!%% !##%y%!"
if %final% geq !m! set m=%final%
for /l %%a in (1 1 %m%) do (
if defined _%%a (
for %%i in (!_%%a!) do set -%%i=faith
for /f "delims=-=" %%s in ('set -') do (
echo %%s
set "-%%s="
)
)
)
pause>nul

时间: 2024-10-21 12:43:13

批处理数值排序问题_DOS/BAT的相关文章

windows批处理命令教程_DOS/BAT

批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们.使用批 处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务.当然我们的这个版本的主要内容是介绍批处理在入侵中一些实际运用,例如我们后面要提到 的用批处理文件来给系统打补丁.批量植入后门程序等.下面就开始我们批处理学习之旅吧. 一.简单批处理内部命令简介 1.echo

DOS批处理高级教程 第七章 DOS批处理编程高级技巧_DOS/BAT

一.交互界面设计 没啥说的,看看高手设计的菜单界面吧: @echo off cls title 终极多功能修复 :menu cls color 0A echo. echo ============================== echo 请选择要进行的操作,然后按回车 echo ============================== echo. echo 1.网络修复及上网相关设置,修复IE,自定义屏蔽网站 echo. echo 2.病毒专杀工具,端口关闭工具,关闭自动播放 echo

Call 从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。_DOS/BAT

Call 从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序.call 命令接受用作调用目标的标签.如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用. 语法 call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]] 参数 [Drive:}[Path] FileName  指定要调用的批处理程序的位置和名称.filename 参数必须具有 .bat 或 .cmd 扩展名.  BatchPara

批处理编程- -介绍_DOS/BAT

用批处理命令把一些特殊的文件按扩展名分类写到一份文件里.高中时代我最初接触到的就是DOS时代,我曾经也研究过批处理命令,但当时学得也不是很好,后来也看过一些过这方面的文章,但也没有进一步深入研究.基本上google,baidu上找不出来任何资料.今天又google,baidur查了一下,发现了好几篇文章(不过模板好像都是基于同一篇文章<简明批处理教程>,还是很少的,不过已经够用了哈. 原作出处已经找不到了,不过还是想转贴一下,实在是好东西,与公与私都要介绍一下: 批处理文件是无格式的文本文件,

自动生成批量执行SQL脚本的批处理实例演示_DOS/BAT

场景: DBA那边给我导出了所有的存储.函数等等对象的创建脚本,有上千个文件. 现在需要将这些对象创建脚本导入到另外一个库,如何解决呢? 手动一个个执行显然不太现实. 于是手动写了一个批处理,将所有的文件形成一个.SQL的脚本,最后以@生成的.SQL脚本方式导入到目标库中. OS环境:WINDOWS xp 脚本内容如下: 复制代码 代码如下: @echo off if exist list.sql del list.sql /q :input cls set input=: set /p inp

写的不错批处理教程一_DOS/BAT

大家知不知道默认共享这回事?这东西用不着的地方可就不是好东西了.所以就要删掉.但这东西是每次系统重起后都会重新创建的.所以每次都要重新打开cmd重新删掉一下.极为麻烦.但有了批处理文件就不一样了,先把命令输入到批处理文件中,然后加入到启动项中,每次启动就会自动运行,免去了每次输入命令的麻烦.   如何创建批处理文件? 将记事本打开,什么都不用写,然后选择文件,保存.保存类型选择所有文件,文件名则命名为*.bat这个*代表是文件名,你可以随便的起.保存好之后,看看你保存的地方,会出现一个白色窗口里

可以使用的批处理参数集合_DOS/BAT

可以在批处理文件内的任何地方使用批处理参数,以提取有关环境设置的信息. Cmd.exe 提供批处理参数扩展变量(%0 到 %9).当在批处理文件中使用批处理参数时,%0 将由批处理文件名替换,而 %1 到 %9 将由在命令行键入的相应参数替换.要访问大于 %9 的参数,必须使用 shift 命令.有关 Shift 命令的详细信息,请参阅 Shift.%* 批处理参数是所有参数(不包括 %0)可引用的通配符,这些参数传递到批处理文件中. 例如,要将 Folder1 中的内容复制到 Folder2,

常用的批处理实用技巧_DOS/BAT

编写批处理代码一年多来,本人积累了一些实用的批处理代码编写技巧,现发出来大家一起分享.若能善用这些代码,将会大大简化各位的编码工作,并会一定程度上提升代码的执行效率.1.不显示代码执行期间的各种提示信息 很多时候,为了使得屏幕上不出现无关的信息,我们需要屏蔽掉命令执行过程中产生的一些提示,有时候是屏蔽掉出错信息,有时候是为了屏蔽成功执行命令的信息,有时候两者都需要屏蔽,那么,我们可以把各种提示信息重定向到空设备中去,具体的代码是: ① 如果要屏蔽成功执行命令的信息,请在语句的最后加上代码 >nu

服务器常用批处理代码[原创]_DOS/BAT

将下面的内容保存为sqlreboot.bat,然后添加到计划任务里,就可以实现一段时间后重启sqlserver服务器了,防止sqlserver经常占用内存过高,导致网页无法打开数据. 复制代码 代码如下: net stop sqlserveragent  net stop mssqlserver  echo.wscript.sleep(50000)>s.vbs  cscript //nologo s.vbs  del s.vbs  net start mssqlserver net start