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

回复 1# vicodin

批处的浮点运算选用 powershell 代劳,顺便再给代劳 ‘整数提取及其排序’,以免后续整体替换时遭遇 ‘大小数嵌套重复’ 的陷阱(避免 ‘...180...80...’ 或 ‘...80...180...’ 文本行有 "大小数嵌套重复" 时被整体替换可能导致的错误)... 以下代码存为 test.bat 运行,与源文件 abc.txt 同目录
  1. @echo off & (for /f "delims=" %%a in (abc.txt) do (
  2.    set "s=%%a" &for /f %%x in (
  3.       'powershell "$a='%%a' -replace '\D+(\d+)',',$1,';$a.split(',')|sort{[int]$_} -des" '
  4.    ) do (setlocal enabledelayedexpansion &for /f %%n in (
  5.       'powershell "[int](%%x*0.925)" ') do set "s=!s:%%x=%%n!")
  6.    echo,!s!&endlocal))>abc.new.txt
  7. pause&exit/b
复制代码
1

评分人数

TOP

本帖最后由 aloha20200628 于 2024-12-2 19:19 编辑

回复 1# vicodin

批处调用 powershell 速度较慢,再给一个能明显提速的版本(存为 test.bat 运行,与源文件 abc.txt 同目录),须在本坛第三方下载以下工具(落地即用,与批处脚本同目录,其中 sort 须更名为 sort76.exe)
   grep v311 http://bcn.bathome.net/s/tool/index.html?key=grep
   gawk v413 http://bcn.bathome.net/s/tool/index.html?key=gawk
   sort v76 http://bcn.bathome.net/s/tool/index.html?key=sort
避免 ‘...180...80...’ 或 ‘...80...180...’ 文本行有 "大小数嵌套重复" 时被整体替换可能导致的错误
  1. @echo off & (for /f "delims=" %%a in (abc.txt) do (
  2.    set "s=%%a" &for /f %%x in ('echo,"%%a"^|grep -o -E "[0-9]+"^|sort76 -n -r') do (
  3.    setlocal enabledelayedexpansion &for /f %%n in (
  4.    'gawk "BEGIN{print(int(%%x*0.925))}" ') do set "s=!s:%%x=%%n!")
  5.    echo,!s!&endlocal))>abc.new.txt
  6. pause&exit/b
复制代码
1

评分人数

TOP

本帖最后由 aloha20200628 于 2024-12-2 19:18 编辑

回复 1# vicodin

若不想预先下载 GNU 系列工具,可用以下 bat+jscript 版本(存为 test.bat 运行,与源文件 abc.txt 同目录),也会比2楼 bat+powershell 版本明显提速...
避免 ‘...180...80...’ 或 ‘...80...180...’ 文本行有 "大小数嵌套重复" 时被整体替换可能导致的错误
  1. 2>1/* ::
  2. @echo off & type "abc.txt"|cscript /nologo /e:jscript "%~f0">"abc.new.txt"
  3. pause&exit/b */
  4. ws=WSH.stdin;
  5. while (!ws.atendofstream) {
  6.    s=ws.readline(), a=s.match(/\d+/g), a=a.sort(function(a,b){return b-a});
  7.    for (i=0,l=a.length; i<l; i++) {
  8.       sn=Math.floor(a[i]*0.925), eval('r=/'+a[i]+'/gi;'), s=s.replace(r,sn); }
  9.    WSH.echo(s); }
复制代码
1

评分人数

TOP

本帖最后由 aloha20200628 于 2024-12-2 19:19 编辑


另一版 bat+Python 混编脚本,存为 test.bat 运行,与源文件 abc.txt 同目录...
避免 ‘...180...80...’ 或 ‘...80...180...’ 文本行有 "大小数嵌套重复" 时被整体替换可能导致的错误
  1. @echo off &more +1 "%~f0">"_._"&python "_._">"abc.new.txt"&del/q "_._"&exit/b
  2. import re
  3. with open('abc.txt') as f:
  4. for l in f:
  5. for d in re.findall('\d+',l):
  6. l=l.replace(d, f'{int(int(d)*0.925)}', 1)
  7. print(l, end='')
复制代码

TOP

返回列表