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

[文本处理] 【已解决】求教:gawk 按字节拆分数据的运用

[复制链接]
发表于 2023-2-25 09:50:04 | 显示全部楼层 |阅读模式
本帖最后由 思想之翼 于 2023-2-25 20:19 编辑
  1. "C:\SoftWare\gawk.exe" -F"=" "NR==FNR{A[$1]=$2;next}{print A[$0]}" "D:\00\a.txt" "D:\11\b.txt">"D:\22\c.txt"
复制代码
上列代码,将一组6位数按照1 3 5字节,拆分成1个文本。

现在有一组32位数,格式如下:
12345678123456781234567812345678
87654321876543218765432187654321

欲按每5个字节一组拆分,共拆分成201376个文本,结果如下:
000001.txt
12345
87654

000002.txt
12346
87653

000003.txt
12347
87652
...

201376.txt
45678
54321

评分

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

查看全部评分

发表于 2023-2-25 11:21:45 | 显示全部楼层
本帖最后由 hfxiang 于 2023-2-25 11:38 编辑

  1. gawk -vFPAT="[0-9]" "{for(i=0;i++<NF;){a[NR,i]=$i}}END{for(i=4;++i<=NF;){for(j=i;j<=NF;j++){fn=sprintf("%06d.txt",++n);print a[1,i-4]a[1,i-3]a[1,i-2]a[1,i-1]a[1,j]"\n"a[2,i-4] a[2,i-3] a[2,i-2] a[2,i-1] a[2,j]"\n">fn;close(fn)}}}" a.txt
复制代码
 楼主| 发表于 2023-2-25 11:37:55 | 显示全部楼层
回复 2# hfxiang

感谢!双击运行无反应啊
发表于 2023-2-25 11:41:02 | 显示全部楼层
回复 3# 思想之翼


俺反复测试后才上传的。能把你的具体操作过程表达一下吗?以便问题查找
 楼主| 发表于 2023-2-25 13:17:04 | 显示全部楼层
回复 4# hfxiang
a.txt  gawk.exe  chaifen.bat 放一个文件夹
出错图片及压缩文件上传不了,抓取了部分文字:
gawk:cmd.line:1:warning:escape sequence '\'treated as plain ''
gawk:cmd.line:1:warning:escape sequence '\'treated as plain ''
gawk:cmd.line:1:warning:escape sequence '\c'treated as plain '\c'
gawk:cmd.line:1:warning:escape sequence '\'treated as plain ''
gawk:cmd.line:1:<FILENAME=a.txt FNR=2>fatal:can't redirect to E:\201376\5chaifen\201376.bat6d.txt'<Invalid argument>
发表于 2023-2-25 13:33:58 | 显示全部楼层
回复 5# 思想之翼


把chaifen.bat放上来看看
 楼主| 发表于 2023-2-25 14:12:53 | 显示全部楼层
回复 6# hfxiang
  1. gawk -vFPAT="[0-9]" "{for(i=0;i++<NF;){a[NR,i]=$i}}END{for(i=4;++i<=NF;){for(j=i;j<=NF;j++){fn=sprintf("%06d.txt",++n);print a[1,i-4]a[1,i-3]a[1,i-2]a[1,i-1]a[1,j]"\n"a[2,i-4] a[2,i-3] a[2,i-2] a[2,i-1] a[2,j]"\n">fn;close(fn)}}}" a.txt
复制代码
chaifen.bat 代码如上
发表于 2023-2-25 16:02:51 | 显示全部楼层
回复 7# 思想之翼


估计是版本问题,把单个“%”改为双“%%”试试,具体如下:

  1. gawk -vFPAT="[0-9]" "{for(i=0;i++<NF;){a[NR,i]=$i}}END{for(i=4;++i<=NF;){for(j=i;j<=NF;j++){fn=sprintf("%%06d.txt",++n);print a[1,i-4]a[1,i-3]a[1,i-2]a[1,i-1]a[1,j]"\n"a[2,i-4] a[2,i-3] a[2,i-2] a[2,i-1] a[2,j]"\n">fn;close(fn)}}}" a.txt
复制代码

评分

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

查看全部评分

发表于 2023-2-25 16:21:45 | 显示全部楼层
本帖最后由 WHY 于 2023-3-3 15:59 编辑

PowerShell 脚本,保存为Test.ps1,右键使用PowerShell运行
运行之前把杀软的文件实时监控关掉,否则频繁的磁盘操作CPU会达到100%,也会拖慢脚本速度

2023/03/03修改,假定每一行数据长度都相同,先创建一个N选M组合的索引表,每行数据按表搜索。
  1. $MyPath    = $MyInvocation.MyCommand.Path -replace '\\[^\\]*$', '\'; #脚本自身路径
  2. $srcFile   = $MyPath + '1.txt';              #源文件
  3. $dstFolder = $MyPath + 'result';             #目标目录

  4. If (![IO.Directory]::Exists($dstFolder)){
  5.     $null = md $dstFolder;
  6. }

  7. Function Get-Combination($n, $m){
  8.     $key = 1;
  9.     $str = '1' * $m + '0' * ($n-$m);         #11111000000000000000000000000000 共32位
  10.     $m = [regex]::Matches($str, '1');
  11.     $Hash.Add($key, $m.Index);               #HashTable赋初始值
  12.     while ($str.IndexOf('10') -ge 0) {
  13.         $str = $str -replace '10(?>(0*))(?>(1*))$', '01$2$1'; #交换 10 <--> 01
  14.         $m = [regex]::Matches($str, '1');
  15.         $Hash.Add(++$key, $m.Index);         #HashTable赋值
  16.     }
  17. }

  18. Function Set-ContentToFile($oDict){
  19.     forEach($key In $oDict.Keys){
  20.         $dstFile = $dstFolder + '\' + (''+$key).PadLeft(6, '0') + '.txt';  #目标文件名
  21.         [IO.File]::AppendAllText($dstFile, $oDict[$key], [Text.Encoding]::Default); #写入文件
  22.     }
  23. }

  24. $Hash = New-Object System.Collections.HashTable;
  25. $n = 32; $m = 5;                             #32选5组合
  26. Get-Combination $n $m                        #创建索引表,存放到$Hash中

  27. $arr = [IO.File]::ReadAllLines($srcFile, [Text.Encoding]::Default);  #读源文本
  28. $dic = New-Object 'System.Collections.Generic.Dictionary[int, string]'; #字典,存放结果
  29. $num = 0;

  30. for($i=0; $i -lt $arr.Count; $i++){
  31.     $chr = [char[]]$arr[$i];                 #转成字符数组
  32.     forEach( $key In $Hash.Keys ){           #遍历索引表
  33.         $s = '';
  34.         for ($j = 0; $j -lt $m; $j++){
  35.             $index = $Hash[$key][$j];
  36.             $s += $chr[$index];
  37.         }
  38.         If (!$dic.ContainsKey($key)) { $dic.Add($key, ''); }
  39.         $dic[$key] += $s + "`r`n";           #字典赋值
  40.     }
  41.     If (++$num % 2 -eq 0){                   #每读取2行数据开始写入文件
  42.         Set-ContentToFile $dic;
  43.         $dic.Clear();                        #清空字典
  44.     }
  45. }

  46. If ($dic.Count -gt 0){                       #字典不为空,写入文件
  47.     Set-ContentToFile $dic;
  48. }

  49. echo 'DONE';
  50. [Console]::ReadLine();
复制代码

评分

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

查看全部评分

发表于 2023-2-25 16:28:26 | 显示全部楼层
本帖最后由 WHY 于 2023-2-27 14:47 编辑

我也来个 gawk
  1. @echo Off
  2. md Result 2>nul
  3. gawk "BEGIN{FS=""}{n=0;for(i=1;i<=NF-4;i++)for(j=i+1;j<=NF-3;j++)for(k=j+1;k<=NF-2;k++)for(L=k+1;L<=NF-1;L++)for(m=L+1;m<=NF;m++){++n;a[n]=a[n]$i$j$k$L$m"\n"}}END{for(i=1;i<=length(a);i++){f="Result/"substr(1000000+i,2)".Log";printf a[i]>f;close(f)}}" 1.txt
  4. pause
复制代码
发现加上close(),关闭文件句柄速度会快很多。

评分

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

查看全部评分

 楼主| 发表于 2023-2-25 16:29:20 | 显示全部楼层
本帖最后由 思想之翼 于 2023-2-25 17:02 编辑

回复 8# hfxiang

感谢!能够运行,但结果不对。32位数,每5个字节组成一组,有201376种组合。
发表于 2023-2-25 16:57:22 | 显示全部楼层
回复 11# 思想之翼


    没能看明白题意,抱歉
 楼主| 发表于 2023-2-25 17:02:36 | 显示全部楼层
回复 12# hfxiang


   非常感谢您的帮助!
发表于 2023-2-25 22:20:03 | 显示全部楼层
回复 5# 思想之翼


如果需要上传文件,可以用阿里云盘或百度网盘。

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
发表于 2023-2-25 22:30:21 | 显示全部楼层
这类组合类问题 主要效率上不去啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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