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

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

例如 125 621 123 121 122 625需要排成
112 112
122
123
125 125
需要的是把数字6变成1,路过大神帮帮忙

回复 7# flashercs
大神昨天4点就回复了,我看代码太短,没当回事,今早测试结果完全正确,大神就是大神,
加大神QQ,发个红包聊表感谢。

TOP

回复 14# WHY


    我参考大神的写法,又写了一个
  1. $file = '1.txt';#文本路径
  2. $result='结果.txt';#输出文件
  3. $text = type $file -ReadCount 0
  4. [int[]]($text  -split ' ') | sort |%{ [int] (($_ -replace '6','1' -split ''|sort) -join '')}|group|%{$_.group -join ' '}|sc $result
复制代码
1

评分人数

    • WHY: 大大神!技术 + 1
QQ 33892006

TOP

回复 16# yhcfsr

完整的问题描述渐渐浮出水面
   

TOP

回复 12# mlxsj1985


之前没仔细看内容.现在代码更正了.
QQ 33892006

TOP

本帖最后由 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
复制代码

TOP

  1. set "str=125 621 123 121 122 625"
  2. PowerShell "[int[]]('%str:6=1%' -split ' ') | sort | group | %%{($_.Name + ' ') * $_.Count}"
复制代码
4

评分人数

    • smss:技术 + 1
    • yhcfsr: 厉害,学习了技术 + 1
    • ivor: 用法新颖技术 + 1
    • 523066680: PS语法糖这么甜的吗 。。。技术 + 1

TOP

  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

评分人数

    • WHY: +1技术 + 1
    • tigerpower: 还可以$_=join '',sort split //技术 + 1

TOP

回复 11# yhcfsr

大神思路完全是正确的,我可能标题没有表达清楚,124 142 241 214 412 421都等于124 带6的全变1 166变111 356变135 其余的一点问题都没有,简直完美。

TOP

注意修改第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);#输出结果
复制代码
QQ 33892006

TOP

偶感觉楼上诸位把数字转为字符串排序,若数字的位数不一样,结果就不是按数字大小排序了。好像最后结果是哈希表,还需进一步处理。

TOP

本帖最后由 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
复制代码
#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

回复 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

评分人数

#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

本帖最后由 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
复制代码
微信:flashercs
QQ:49908356

TOP

回复 4# mlxsj1985
那看不懂你的问题

TOP

返回列表