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

[文本处理] 【已解决】gawk:如何统计未出现数据

[复制链接]
发表于 2023-8-29 20:02:32 | 显示全部楼层 |阅读模式
本帖最后由 思想之翼 于 2023-8-29 22:31 编辑

文本记录数值为:
000 001
002

如何用gawk,统计未出现数据(000~999)?

结果为:
003 004 005...997 998 999

评分

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

查看全部评分

发表于 2023-8-29 21:20:16 | 显示全部楼层
本帖最后由 Five66 于 2023-8-29 21:53 编辑

不知这样子行否,代码已修正(?)

  1. gawk "BEGIN{distart=0;diend=999;i=1;j=0}{j+=NF;for(i;i<j+1;i++){A[i]=1}}END{for(i=distart;i<=diend;i++){if(!A[i]){j=sprintf("%%03d",i);print j}}}" aaa.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢!经测试,无输出文件。

查看全部评分

发表于 2023-8-29 21:26:10 | 显示全部楼层
回复 2# Five66


    啊,在cmd窗口里直接输入命令时得将%%03d改成%03d

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢分享

查看全部评分

发表于 2023-8-29 21:28:32 | 显示全部楼层
输出文件什么的自己加上啦啦啦啦啦
 楼主| 发表于 2023-8-29 21:31:52 | 显示全部楼层
本帖最后由 思想之翼 于 2023-8-29 21:43 编辑

回复 3# Five66
用 bat 脚本方式(双百分号%),输出结果为空。

gawk "BEGIN{distart=0;diend=999;i=1;j=0}{j+=NF;for(i;i<j+1;i++){A=1}}END{for(i=distart;i<=diend:i++){if(!A){j=sprintf(\"%%03d\",i);print j}}}" 1.txt>2.txt
发表于 2023-8-29 21:47:44 | 显示全部楼层
回复 5# 思想之翼


    啊,不好意思,手抖打错了i<=diend后面那个是英文分号,不是冒号
 楼主| 发表于 2023-8-29 21:59:05 | 显示全部楼层
回复 6# Five66

经测试,结果不正确。
发表于 2023-8-29 22:19:40 | 显示全部楼层
  1. gawk "BEGIN{for(i=0;i<=999;i++){num=sprintf("%%03d",i);nums[i]=num}}{for(i=1;i<=NF;i++)a[$i]}END{for(i=0;i<=999;i++){if(!(nums[i] in a))out=out nums[i] " "}print out}" 1.txt > 2.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢!结果正确。

查看全部评分

发表于 2023-8-29 22:23:05 | 显示全部楼层
回复 7# 思想之翼

试试下面的还行不行吧

  1. gawk "BEGIN{distart=0;diend=999}{for(i=1;i<=NF;i++){A[$i]=1}}END{for(i=distart;i<=diend;i++){j=sprintf("%%03d",i);if(!A[j]){print j}}}" aaa.txt >bbb.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 谢谢!结果正确。

查看全部评分

发表于 2023-8-30 10:16:49 | 显示全部楼层
回复 1# 思想之翼

看到了已解决了,但还是来个自认为简洁一点的

  1. gawk "{for(i=1;i<=NF;i++)a[$i]}END{for(i=1;i<1000;i++){B=sprintf("%03d",i);if(!(B in a))printf("%s ",B)}}" a.txt>b.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢分享

查看全部评分

 楼主| 发表于 2023-8-30 21:26:55 | 显示全部楼层
回复 10# hfxiang
感谢!结果正确,但缺少换行回车。
发表于 2023-8-31 07:42:41 | 显示全部楼层
本帖最后由 Nsqs 于 2023-8-31 08:12 编辑
  1. $source=@'
  2. 000 001
  3. 002
  4. '@

  5. 0..999|%{$diff='{0:d3}' -f $_;if(!($source -match '{0:d3}' -f $diff)){[PSCustomObject]@{缺少=$diff}}}
复制代码
来段PowerShell的解法

bat:
  1. @echo off
  2. set "file=1.txt"
  3. powershell -noprofile -executionpolicy bypass "$source=gc %file%;0..999|%%{$diff='{0:d3}' -f $_;if(!($source -match '{0:d3}' -f $diff)){[PSCustomObject]@{缺少=$diff}}}">b.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢分享

查看全部评分

发表于 2023-8-31 10:56:36 | 显示全部楼层
回复 11# 思想之翼

俺看到1楼的结果是连续的,还特别做了处理,不让换行,要换行的如下(在命令行中执行):

  1. gawk "{for(i=1;i<=NF;i++)a[$i]}END{for(i=1;i<1000;i++){B=sprintf("%03d",i);if(!(B in a))print B}}" a.txt>b.txt
复制代码

评分

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

查看全部评分

 楼主| 发表于 2023-8-31 11:12:29 | 显示全部楼层
回复 13# hfxiang
感谢!13#结果正确。10#结果横排连续,只是横排的末尾数据,缺少换行,请问如何添加?
发表于 2023-8-31 15:25:00 | 显示全部楼层
回复 14# 思想之翼
没明白是什么意思
既然13#满足要求,就用13#的,丢弃10#的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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