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

[文本处理] 批处理怎样按第1列最后一个字符指定排列?

本帖最后由 娜美 于 2023-10-27 23:59 编辑

需要批量处理多个文件   处理后原文件名称不变,  在各个文件名添加tmp后缀就行      如 a.txt.tmp   
制表符为分隔    bat按第1列的最后一个字符重新排列行次序     例如要指定最后一个字符排列顺序  "1| 2| 3 |4 |5 |0"
谢谢

按第1列最后一个字符指定排列
例 这第1列最后一个字符
1*2*0*00*0*0*0*4*52                23.10.2023 10:52:38 35262

https://wwkt.lanzoul.com/iAuSc1d1p2pi
需要批量处理多个文件,    详细可请看连接示例
谢谢

本帖最后由 娜美 于 2023-10-27 19:56 编辑

代码框里的字体看起来是不是有点过于小呢?   不知道是网页还是平台设的, 代码框里的字体和外框字体比例似乎不适合是吗 ?     想变大代码框里的字体似乎会混乱

TOP

  1. @echo off
  2. (for %%a in (1 2 3 4 5 0) do (
  3. findstr /rc:"-[a-z0-9]%%a" a.txt |sort
  4. ))>b.txt
  5. pause
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 娜美 于 2023-10-27 21:22 编辑

回复 3# 77七

似乎不能处理有超长字符行
sorry   忘了说有些文件长度有些行超600个字符的,  对了我还忘了需要批量处理多个文件
哥哥   分隔符需要是制表符, 不能是 "-" 哦      我重新编了主题

TOP

回复 4# 娜美


    请找一个包含超长字符串的文件上传到网盘以便测试
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 5# Batcher

ok 谢谢哥哥提醒
    https://wwkt.lanzoul.com/iAuSc1d1p2pi

TOP

回复 4# 娜美


    6楼样本里的通配符,不知道指什么?
如果文本有规律可寻,你可以把真实的文本,比如数字用数字替代,不同数字用不同数字替代,汉字同样处理,保留符号不变,仿制真实的数据提供。

这样样本测试通过,就不会存在问题了,否则样本不能代表实际情况,也失去样本的意义。
bat小白,请多指教!谢谢!

TOP

  1. @if (0)==(0) echo off
  2. cscript -nologo -e:jscript %0<a.txt>b.txt
  3. pause & exit
  4. @end
  5. var arr = WSH.StdIn.ReadAll().split(/[\r\n]+/);
  6. pad = function(n) { return n>0 ? n : 10 };
  7. WSH.Echo(arr.sort(function(a,b) { return pad(a.split(/[\t]+/)[0].slice(-1)) - pad(b.split(/[\t]+/)[0].slice(-1)) }).join('\n'));
复制代码

TOP

本帖最后由 qixiaobin0715 于 2023-10-28 10:14 编辑

上传文件最好是一个真实文件,最起码也是真实文件的片段(如果有不便显示全部内容的话),如果随便造一个文件传上来,那么与胡乱写写,然后贴出来又有何区别呢。
    如果像你提供的样本,第一列最后一个字符都是数字的话:
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  3.     (for /f "tokens=1* delims= " %%j in ('type "%%i"') do (
  4.         set "str=%%j"
  5.         setlocal enabledelayedexpansion
  6.         set "n=!str:~-1!"
  7.         if !n! equ 0 (
  8.             echo,a %%j %%k
  9.         ) else (
  10.             echo,!n! %%j %%k
  11.         )
  12.         endlocal
  13.     ))>temp
  14.     (for /f "tokens=1* delims= " %%j in ('sort temp') do echo,%%k)>%%i.tmp
  15. )
  16. del temp
复制代码

TOP

只单纯的按"1| 2| 3 |4 |5 |0"顺序分组,不再对分组进行排序
a.txt编码ansi或gbk
保存为ansi编码的bat
  1. @if (0)/*==(0)/* echo off
  2. cscript //nologo //e:jscript "%~f0" <a.txt >a.txt.tmp
  3. echo done&pause
  4. rem */@end
  5. var aaa="1| 2| 3 |4 |5 |0";
  6. var s='\t';
  7. aaa=aaa.replace(/ /g,'').split(/\|/);
  8. aaa.push('and so on');
  9. var nil=null,hash={},i;
  10. var puts=function(s){WScript.Echo(s);};
  11. for(i in aaa){hash[i]=[];}
  12. hash['and so on']=[];
  13. var f,g;
  14. while (!WScript.StdIn.AtEndOfStream) {
  15. f = WScript.StdIn.ReadLine();
  16. if(!f){continue;}
  17. i=f.search(s);
  18. if(i != -1){
  19. g=f.substr(i-1,1);
  20. if(!hash[g]){hash['and so on'].push(f);}
  21. else{hash[g].push(f);}
  22. }
  23. else {
  24. g=f.substr(f.length-1,1);
  25. if(!hash[g]){hash['and so on'].push(f);}
  26. else{hash[g].push(f);}
  27. }
  28. }
  29. for(i=0;i<aaa.length;i++)
  30. {
  31. g=hash[aaa[i]].length;
  32. for(s=0;s<g;s++){
  33. puts(hash[aaa[i]][s]);
  34. }
  35. }
复制代码

TOP

本帖最后由 hfxiang 于 2023-10-28 11:51 编辑

回复 1# 娜美

第3方工具gawk( http://bcn.bathome.net/tool/5.1.0/gawk.exe )实现方法如下:
  1. gawk "NF{a[NR]=substr($1, length($1), 1);b[NR]=$0}END{PROCINFO[\"sorted_in\"]=\"sort_func\";for(j in a)print b[j]}function sort_func(i1,v1,i2,v2,V1,V2){V1=v1==0?6:v1;V2=v2==0?6:v2;return(V1+0>V2+0?1:(V1+0<V2+0?-1:(i1+0<i2+0?-1:1)))}" a.txt>a.txt.tmp
复制代码

TOP

多谢各位哥哥   

TOP

返回列表