Board logo

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

作者: 思想之翼    时间: 2023-8-29 20:02     标题: 【已解决】gawk:如何统计未出现数据

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

文本记录数值为:
000 001
002

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

结果为:
003 004 005...997 998 999
作者: Five66    时间: 2023-8-29 21:20

本帖最后由 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
复制代码

作者: Five66    时间: 2023-8-29 21:26

回复 2# Five66


    啊,在cmd窗口里直接输入命令时得将%%03d改成%03d
作者: Five66    时间: 2023-8-29 21:28

输出文件什么的自己加上啦啦啦啦啦
作者: 思想之翼    时间: 2023-8-29 21:31

本帖最后由 思想之翼 于 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
作者: Five66    时间: 2023-8-29 21:47

回复 5# 思想之翼


    啊,不好意思,手抖打错了i<=diend后面那个是英文分号,不是冒号
作者: 思想之翼    时间: 2023-8-29 21:59

回复 6# Five66

经测试,结果不正确。
作者: buyiyang    时间: 2023-8-29 22:19

  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
复制代码

作者: Five66    时间: 2023-8-29 22:23

回复 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
复制代码

作者: hfxiang    时间: 2023-8-30 10:16

回复 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
复制代码

作者: 思想之翼    时间: 2023-8-30 21:26

回复 10# hfxiang
感谢!结果正确,但缺少换行回车。
作者: Nsqs    时间: 2023-8-31 07:42

本帖最后由 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
复制代码

作者: hfxiang    时间: 2023-8-31 10:56

回复 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
复制代码

作者: 思想之翼    时间: 2023-8-31 11:12

回复 13# hfxiang
感谢!13#结果正确。10#结果横排连续,只是横排的末尾数据,缺少换行,请问如何添加?
作者: hfxiang    时间: 2023-8-31 15:25

回复 14# 思想之翼
没明白是什么意思
既然13#满足要求,就用13#的,丢弃10#的。
作者: Five66    时间: 2023-8-31 15:55

回复 15# hfxiang


    意思是10#代码输出的最末尾没有换行符,printf的输出是不换行的




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2