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

[文本处理] 【已解决】批处理如何求得每行数值的未出现数?

[复制链接]
发表于 2023-7-7 03:16:42 | 显示全部楼层 |阅读模式
本帖最后由 思想之翼 于 2023-7-7 18:10 编辑

文本记录数值为
EA=000 001
BB=002 005 006 999
...
AA=000 003 998

问题:如何求每行“=”右侧数值的未出现数(000~999)

结果为
EA=002 003...998 999
BB=000 001 003 004 007...998
...
AA=001 002 004...999

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2023-7-7 09:11:58 | 显示全部楼层
  1. @echo off
  2. (for /f "tokens=1* delims==" %%a in (a.txt) do (
  3.     setlocal enabledelayedexpansion
  4.     for %%i in (%%b) do (
  5.         set n=%%i
  6.         set /a n=n
  7.         set _!n!=true
  8.     )
  9.     set /p str=%%a=<nul
  10.     for /l %%j in (0,1,999) do (
  11.         if not defined _%%j (
  12.             set m=00%%j
  13.             set m=!m:~-3!
  14.             set /p str=!m! <nul
  15.         )
  16.     )
  17.     echo,
  18.     endlocal
  19. ))>b.txt
  20. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 乐于助人

查看全部评分

发表于 2023-7-7 09:27:17 | 显示全部楼层
突然想起前几天的一个类似的帖子中,Batcher老大说处理后行的最后面多了个逗号,2楼代码同样每行最后多出了一个空格,如果要求严谨的话可以这样:
  1. @echo off
  2. (for /f "tokens=1* delims==" %%a in (a.txt) do (
  3.     setlocal enabledelayedexpansion
  4.     for %%i in (%%b) do (
  5.         set n=%%i
  6.         set /a n=n
  7.         set _!n!=true
  8.     )
  9.     set /p str=%%a=<nul
  10.     for /l %%j in (0,1,999) do (
  11.         if not defined _%%j (
  12.             set /p str=!m! <nul
  13.             set m=00%%j
  14.             set m=!m:~-3!
  15.         )
  16.     )
  17.     set /p str=!m!<nul
  18.     echo,
  19.     endlocal
  20. ))>b.txt
  21. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 乐于助人

查看全部评分

发表于 2023-7-7 09:45:08 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /L %%i in (1000 1 1999) do set "str=!str! %%i"
  4. set "str=!str: 1= !"

  5. (for /f "tokens=1* delims==" %%i in (1.txt) do (
  6.         set "s=!str!"
  7.         for %%k in (%%j) do set "s=!s: %%k=!"
  8.         echo;%%i=!s:~1!
  9. )) > 2.txt
  10. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 乐于助人

查看全部评分

发表于 2023-7-7 11:28:10 | 显示全部楼层
回复 1# 思想之翼

  1. gawk -F"[ =]+" -v BINMODE="w" "BEGIN{for(i=0;i<1000;i++)a[i]=sprintf("\04503d",i)}{for(i=1;i<=NF;i++)b[$i];c=$1"=";for(i=0;i<1000;i++)if(!(a[i] in b))c=c a[i]" ";sub(/ $/,"",c);print c;delete b}" a.txt>b.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 乐于助人

查看全部评分

发表于 2023-7-7 16:27:48 | 显示全部楼层
建议楼主把测试后采用的最佳方案说一下
我看你好几个贴都没指出最终方案
 楼主| 发表于 2023-7-7 18:07:27 | 显示全部楼层
本帖最后由 思想之翼 于 2023-7-7 21:28 编辑

回复 6# czjt1234
您好!几个方案皆出现乱码(格式为 Windows(CRLF) UTF-16LE),正在自查原因。
发表于 2023-7-7 22:06:30 | 显示全部楼层
回复 7# 思想之翼


    txt和bat都改成ANSI试试
 楼主| 发表于 2023-7-7 23:59:54 | 显示全部楼层
本帖最后由 思想之翼 于 2023-7-8 00:13 编辑

回复 8# Batcher
txt和bat的内容没有中文,UTF-8改成ANSI后保存,再次打开依然是Windows(CRLF) UTF-8格式。
奇怪啊,5#gawk方案,txt行数小于等于19行,结果正常(格式为 Unix(LF) UTF-8)。
发表于 2023-7-8 07:55:59 | 显示全部楼层
回复 7# 思想之翼


    你可以把测试出现乱码的 txt 文件放到网盘,分享链接,让大家帮你找原因。
发表于 2023-7-8 14:02:17 | 显示全部楼层
回复 9# 思想之翼


    UTF-8改成ANSI后保存,不要再打开了,直接执行脚本
发表于 2023-7-8 14:41:40 | 显示全部楼层
回复 9# 思想之翼


    你的ANSI是啥,不会是英文系统吧
 楼主| 发表于 2023-7-8 18:09:39 | 显示全部楼层
感谢各位老师热心帮助!问题已解决。乱码原因是:各文件夹内文件多头输入,来源庞杂,格式混乱。4#5#代码简洁,速度快。3#代码速度稍逊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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