找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 75852|回复: 16

[文本处理] 批处理如何实现数字排序?

[复制链接]
发表于 2019-3-7 14:39:31 | 显示全部楼层 |阅读模式
例如 125 621 123 121 122 625需要排成
112 112
122
123
125 125
需要的是把数字6变成1,路过大神帮帮忙
 楼主| 发表于 2019-3-7 14:45:24 | 显示全部楼层

如何实现txt文本数字排序

例如 125 621 123 121 122 625需要排成
112 112
122
123
125 125
需要的是把数字6变成1,路过大神帮帮忙,10元红包答谢
 楼主| 发表于 2019-3-7 15:31:43 | 显示全部楼层
回复 2# smss
好像不是啊
发表于 2019-3-7 16:09:14 | 显示全部楼层
回复 4# mlxsj1985
那看不懂你的问题
发表于 2019-3-7 16:21:43 | 显示全部楼层
本帖最后由 flashercs 于 2019-3-7 16:51 编辑

a.bat
  1. @echo off
  2. set "file1=e:\test\1.txt"
  3. set "file2=e:\test\2.txt"
  4. powershell -command "((([regex]'\d+').Matches([System.IO.File]::ReadAllText("%file1%",[System.Text.Encoding]::Default))|ForEach-Object{(($_.Value -replace '6','1').ToCharArray()|Sort-Object) -join ''})|Sort-Object|Group-Object|%%{$_.Group -join ' '})|set-content -LiteralPath "%file2%""
  5. pause
  6. exit /b
复制代码
发表于 2019-3-7 16:22:56 | 显示全部楼层
回复 1# mlxsj1985
  1. "125 621 123 121 122 625".Replace("6","1").Split(' ') | group | Sort-Object -Property Name
复制代码
  1. @echo off
  2. set num=125 621 123 121 122 625
  3. for /f "delims=" %%a in ('powershell -command "& {'%num%'.Replace('6','1').Split(' ') | group | Sort-Object -Property Name}"') do (
  4. echo %%a
  5. )
  6. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
WHY + 1 +1

查看全部评分

发表于 2019-3-7 16:38:04 | 显示全部楼层
本帖最后由 ivor 于 2019-3-7 16:39 编辑
  1. @echo off
  2. for /f "delims=" %%a in ('powershell -command "& {[regex]::Matches([System.IO.StreamReader]::new('C:\Users\mac\Desktop\ip.txt').ReadToEnd().Replace('6','1'),'\d+') | group | sort -Property Name | select Group}"') do (
  3. echo %%a)
  4. pause
复制代码
发表于 2019-3-7 17:50:13 | 显示全部楼层
偶感觉楼上诸位把数字转为字符串排序,若数字的位数不一样,结果就不是按数字大小排序了。好像最后结果是哈希表,还需进一步处理。
发表于 2019-3-7 17:53:44 | 显示全部楼层

注意修改第9行的文本路径

本帖最后由 yhcfsr 于 2019-3-7 20:28 编辑
  1. <# :
  2. @echo off&cd/d "%~dp0"
  3. more +8 "%~f0" >"%temp%\%~n0.ps1"
  4. powershell -NoLogo -NoProfile -ExecutionPolicy bypass -File "%temp%\%~n0.ps1"
  5. del /f /q "%temp%\%~n0.ps1"
  6. pause
  7. #>

  8. $file = 'C:\Users\CF\Desktop\1.txt';#文本路径

  9. $ErrorActionPreference = 'SilentlyContinue';
  10. $text = [io.file]::ReadAllText($file,[text.encoding]::Default);
  11. [System.Collections.ArrayList] $arr = ($text -split '\s');
  12. $result = @{};

  13. foreach($elem in $arr)
  14. {
  15.         if($elem) {
  16.                 $elem = $elem -replace '6','1';
  17.         $str='';
  18.                 $elem -split ''|sort-object|%{$str+=$_}

  19.                 $result.Add([int] $str, $str);
  20.                 if(!$?) { $result[[int] $str] += ' ' + $str; }
  21.         }
  22. }

  23. $arr.Clear();
  24. foreach($key in $result.Keys|Sort-Object)
  25. {
  26.     [void] $arr.Add($result[$key]);
  27. }

  28. [io.file]::WriteAllLines('结果.txt',$arr,[text.encoding]::Default);#输出结果
复制代码
 楼主| 发表于 2019-3-7 19:47:16 | 显示全部楼层
回复 11# yhcfsr

大神思路完全是正确的,我可能标题没有表达清楚,124 142 241 214 412 421都等于124 带6的全变1 166变111 356变135 其余的一点问题都没有,简直完美。
发表于 2019-3-7 20:11:12 | 显示全部楼层
  1. my @nums = qw/125 621 123 121 122 625 6625 1126 1125/;
  2. grep { tr/6/1/; $_ = join("", sort split("", $_)) } @nums;
  3. print join(",", sort { $a <=> $b } @nums);
复制代码
112,112,122,123,125,125,1112,1125,1125

评分

参与人数 2技术 +2 收起 理由
WHY + 1 +1
tigerpower + 1 还可以$_=join '',sort split //

查看全部评分

发表于 2019-3-7 20:14:36 | 显示全部楼层
  1. set "str=125 621 123 121 122 625"
  2. PowerShell "[int[]]('%str:6=1%' -split ' ') | sort | group | %%{($_.Name + ' ') * $_.Count}"
复制代码

评分

参与人数 4技术 +4 收起 理由
smss + 1
yhcfsr + 1 厉害,学习了
ivor + 1 用法新颖
523066680 + 1 PS语法糖这么甜的吗 。。。

查看全部评分

发表于 2019-3-7 20:16:41 | 显示全部楼层
本帖最后由 WHY 于 2019-3-9 00:14 编辑

  1. @echo off & setlocal enabledelayedexpansion
  2. if "%~1" == "arg" (
  3.     set "str=125 621 123 121 122 625"
  4.     for %%i in ( !str:6^=1! ) do (
  5.         set "var=%%i"
  6.         set "s="
  7.         for /L %%j in (0 1 9) do (
  8.             for %%k in ("!var:%%j=" "!") do set "s=!s!%%j"
  9.             set "s=!s:~0,-1!"
  10.         )
  11.         echo;!s!
  12.     )
  13. ) else (
  14.     for /f %%i in ('"%~f0" arg ^| sort ^& echo;/') do (
  15.         if "%%i" == "!s!" (
  16.             set /p "=!s! "
  17.         ) else if defined s (
  18.             echo;!s!
  19.         )
  20.         set "s=%%i"
  21.     ) < nul
  22.     pause & exit /b
  23. )
复制代码
  1. @echo off
  2. set "str=125 621 123 121 122 625"
  3. PowerShell "'%str:6=1%' -split '\s+' | %%{([char[]]$_ | sort) -join ''} | sort | group | %%{($_.Name + ' ') * $_.Count}"
  4. pause
复制代码
发表于 2019-3-7 20:31:20 | 显示全部楼层
回复 12# mlxsj1985


之前没仔细看内容.现在代码更正了.
发表于 2019-3-7 20:40:48 | 显示全部楼层
回复 16# yhcfsr

完整的问题描述渐渐浮出水面
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 01:17 , Processed in 0.024503 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表