标题: [文本处理] 批处理怎样按第1列最后一个字符指定排列? [打印本页]
作者: 娜美 时间: 2023-10-27 19:47 标题: 批处理怎样按第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:51
本帖最后由 娜美 于 2023-10-27 19:56 编辑
代码框里的字体看起来是不是有点过于小呢? 不知道是网页还是平台设的, 代码框里的字体和外框字体比例似乎不适合是吗 ? 想变大代码框里的字体似乎会混乱
作者: 77七 时间: 2023-10-27 20:16
- @echo off
- (for %%a in (1 2 3 4 5 0) do (
- findstr /rc:"-[a-z0-9]%%a" a.txt |sort
- ))>b.txt
- pause
复制代码
作者: 娜美 时间: 2023-10-27 21:01
本帖最后由 娜美 于 2023-10-27 21:22 编辑
回复 3# 77七
似乎不能处理有超长字符行
sorry 忘了说有些文件长度有些行超600个字符的, 对了我还忘了需要批量处理多个文件
哥哥 分隔符需要是制表符, 不能是 "-" 哦 我重新编了主题
作者: Batcher 时间: 2023-10-27 21:52
回复 4# 娜美
请找一个包含超长字符串的文件上传到网盘以便测试
作者: 娜美 时间: 2023-10-27 23:57
回复 5# Batcher
ok 谢谢哥哥提醒
https://wwkt.lanzoul.com/iAuSc1d1p2pi
作者: 77七 时间: 2023-10-28 06:12
回复 4# 娜美
6楼样本里的通配符,不知道指什么?
如果文本有规律可寻,你可以把真实的文本,比如数字用数字替代,不同数字用不同数字替代,汉字同样处理,保留符号不变,仿制真实的数据提供。
这样样本测试通过,就不会存在问题了,否则样本不能代表实际情况,也失去样本的意义。
作者: terse 时间: 2023-10-28 07:53
- @if (0)==(0) echo off
- cscript -nologo -e:jscript %0<a.txt>b.txt
- pause & exit
- @end
- var arr = WSH.StdIn.ReadAll().split(/[\r\n]+/);
- pad = function(n) { return n>0 ? n : 10 };
- WSH.Echo(arr.sort(function(a,b) { return pad(a.split(/[\t]+/)[0].slice(-1)) - pad(b.split(/[\t]+/)[0].slice(-1)) }).join('\n'));
复制代码
作者: qixiaobin0715 时间: 2023-10-28 08:56
本帖最后由 qixiaobin0715 于 2023-10-28 10:14 编辑
上传文件最好是一个真实文件,最起码也是真实文件的片段(如果有不便显示全部内容的话),如果随便造一个文件传上来,那么与胡乱写写,然后贴出来又有何区别呢。
如果像你提供的样本,第一列最后一个字符都是数字的话:- @echo off
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- (for /f "tokens=1* delims= " %%j in ('type "%%i"') do (
- set "str=%%j"
- setlocal enabledelayedexpansion
- set "n=!str:~-1!"
- if !n! equ 0 (
- echo,a %%j %%k
- ) else (
- echo,!n! %%j %%k
- )
- endlocal
- ))>temp
- (for /f "tokens=1* delims= " %%j in ('sort temp') do echo,%%k)>%%i.tmp
- )
- del temp
复制代码
作者: Five66 时间: 2023-10-28 09:11
只单纯的按"1| 2| 3 |4 |5 |0"顺序分组,不再对分组进行排序
a.txt编码ansi或gbk
保存为ansi编码的bat- @if (0)/*==(0)/* echo off
-
- cscript //nologo //e:jscript "%~f0" <a.txt >a.txt.tmp
-
- echo done&pause
- rem */@end
-
- var aaa="1| 2| 3 |4 |5 |0";
- var s='\t';
- aaa=aaa.replace(/ /g,'').split(/\|/);
- aaa.push('and so on');
-
- var nil=null,hash={},i;
- var puts=function(s){WScript.Echo(s);};
- for(i in aaa){hash[i]=[];}
- hash['and so on']=[];
-
- var f,g;
- while (!WScript.StdIn.AtEndOfStream) {
- f = WScript.StdIn.ReadLine();
- if(!f){continue;}
- i=f.search(s);
- if(i != -1){
- g=f.substr(i-1,1);
- if(!hash[g]){hash['and so on'].push(f);}
- else{hash[g].push(f);}
- }
- else {
- g=f.substr(f.length-1,1);
- if(!hash[g]){hash['and so on'].push(f);}
- else{hash[g].push(f);}
- }
- }
-
- for(i=0;i<aaa.length;i++)
- {
- g=hash[aaa[i]].length;
- for(s=0;s<g;s++){
- puts(hash[aaa[i]][s]);
- }
- }
复制代码
作者: hfxiang 时间: 2023-10-28 09:13
本帖最后由 hfxiang 于 2023-10-28 11:51 编辑
回复 1# 娜美
第3方工具gawk( http://bcn.bathome.net/tool/5.1.0/gawk.exe )实现方法如下:- 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
复制代码
作者: 娜美 时间: 2023-10-28 11:03
多谢各位哥哥
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |