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

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

本帖最后由 思想之翼 于 2023-8-29 22:31 编辑

文本记录数值为:
000 001
002

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

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

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 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

TOP

回复 2# Five66


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

评分人数

TOP

输出文件什么的自己加上啦啦啦啦啦

TOP

本帖最后由 思想之翼 于 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

TOP

回复 5# 思想之翼


    啊,不好意思,手抖打错了i<=diend后面那个是英文分号,不是冒号

TOP

回复 6# Five66

经测试,结果不正确。

TOP

  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

评分人数

TOP

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

评分人数

TOP

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

评分人数

TOP

回复 10# hfxiang
感谢!结果正确,但缺少换行回车。

TOP

本帖最后由 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

评分人数

TOP

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

评分人数

TOP

回复 13# hfxiang
感谢!13#结果正确。10#结果横排连续,只是横排的末尾数据,缺少换行,请问如何添加?

TOP

回复 14# 思想之翼
没明白是什么意思
既然13#满足要求,就用13#的,丢弃10#的。

TOP

返回列表