Board logo

标题: [文本处理] 批处理怎样把文本中整数做统计并按频率排序 [打印本页]

作者: hkldd    时间: 2020-7-20 15:37     标题: 批处理怎样把文本中整数做统计并按频率排序

文本中全是数字,毎行就是:01 02 03 04 05 06这样的格式,有很多行,人工统计慢易出错,哪位大大写个脚本,谢谢!
  1. 01 02 03 05 06 23
  2. 01 02 03 05 06 28
  3. 01 02 03 05 06 30
  4. 01 02 03 05 07 08
  5. 01 02 03 05 07 09
  6. 01 02 03 05 07 10
  7. 01 02 03 05 07 11
  8. 01 02 03 05 07 12
  9. 01 02 03 05 07 13
  10. 01 02 03 05 07 14
  11. 01 02 03 05 07 15
  12. 01 02 03 05 07 16
  13. 01 02 03 05 07 17
  14. 01 02 03 05 07 18
  15. 01 02 03 05 07 19
  16. 01 02 03 05 07 20
  17. 01 02 03 05 07 21
  18. 01 02 03 05 07 22
  19. 01 02 03 05 07 24
  20. 01 02 03 05 07 25
复制代码
上面的数以整数50以下的话想得到这样的样式
  1. 共00次:04,26,27,29,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,
  2. 共01次:08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,28,30,
  3. 共03次:06,
  4. 共17次:07,
  5. 共20次:01,02,03,05,
复制代码

作者: Batcher    时间: 2020-7-20 16:01

回复 1# hkldd


    请给出10行左右的原始数据作为测试样例,并给出对于这份测试样例希望得到的完整结果。
作者: went    时间: 2020-7-20 21:53

数字统计?
  1. @echo off
  2. set "txt=0.txt"
  3. powershell -c "(Get-Content '%txt%' |  Out-String ) -split '\s+' | Group-Object {$_} | Sort-Object Count | Group-Object {$_.Count}  | foreach { Write-Host ('共{0:d2}次: {1}' -f [int]$_.Name,(($_.Group.Name | Sort-Object | Out-String) -replace '\s+',','))}"
  4. pause&exit
复制代码

作者: hkldd    时间: 2020-7-22 11:15

你好大侠!运行后截图如下:

只有次数,没有对应的数字,麻烦你得闲看一下,谢谢!
作者: smss    时间: 2020-7-22 11:24

回复 4# hkldd win10测试正常 更新下powershell
作者: went    时间: 2020-7-22 13:24

回复 4# hkldd
兼容win7
  1. @echo off
  2. set "txt=0.txt"
  3. powershell -version 2.0 -c "$txt='%txt%';Get-Content '%~0' | Select-Object -Skip 4 | Out-String | Invoke-Expression"
  4. pause&exit
  5. $datas=(Get-Content '0.txt' |  Out-String ) -split '\s+';
  6. $s1=(1..50 | Where-Object {$datas -notcontains ('{0:d2}' -f $_)} | foreach {'{0:d2}' -f $_} | Out-String)
  7. $s1=$s1 -replace '\s+',','
  8. Write-Host ('共{0:d2}次: {1}' -f [int]0,$s1)
  9. $datas | Group-Object {$_} |
  10.     Sort-Object Count | Group-Object Count |
  11.         foreach {
  12.             $str=($_.Group | Sort-Object {$_.Name} | Select-Object Name | Out-String ) -replace 'Name|-+|\s+',',' -replace ',{2,}',''
  13.             Write-Host ('共{0:d2}次: {1}' -f [int]$_.Name,$str)
  14.         }
复制代码

作者: hkldd    时间: 2020-7-22 15:14

完美解决!谢谢大侠
作者: asnahu    时间: 2020-7-30 10:46

  1. gawk '{for(i=1;i<=NF;i++){a[$i] = ($i in a) ? a[$i]+=1 : a[$i]=1}}END{for(i in a)print i,a[i]}' txt
复制代码





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