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

[其他] 【已解决】如何优化gawk脚本实现单次解析

本帖最后由 思想之翼 于 2025-3-9 18:56 编辑

下列3行代码,分别提取 A.txt 个数范围为N=3-5   N=1-2   N=6-100 的字符,写入1.txt   2.txt
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. gawk -v"N=3-5" -v"RS=\r?\n| " -v"ORS= " "{++d[$0]}END{split(N,M,/-/);for(j=M[1];j<=M[2];j++){for(i in d)if(d[i]==j)print i}}" D:\DATA\A.txt>D:\DATA\1.txt
  4. gawk -v"N=1-2" -v"RS=\r?\n| " -v"ORS= " "{++d[$0]}END{split(N,M,/-/);for(j=M[1];j<=M[2];j++){for(i in d)if(d[i]==j)print i}}" D:\DATA\A.txt>D:\DATA\2.txt
  5. gawk -v"N=6-100" -v"RS=\r?\n| " -v"ORS= " "{++d[$0]}END{split(N,M,/-/);for(j=M[1];j<=M[2];j++){for(i in d)if(d[i]==j)print i}}" D:\DATA\A.txt>>D:\DATA\2.txt
  6. endlocal
  7. exit
复制代码
D:\DATA\ 数据格式如下:
G B B
B C C C A
J A
J
E
E D
M M M M M M
M M
N N N N N

结果为:
1.txt
B C N
2.txt
D G A E J M

【问题】
上述3行代码,对 A.txt 解析了3次,如何合并代码,对 A.txt 解析1次后,分别提取N=3-5   N=1-2   N=6-100 的字符,写入1.txt   2.txt,减少I/O操作,提升执行效率。


【注1】下列代码,运行结果符合预期
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%f in (1,1,500) do (
  4. set q=%%f
  5. gawk -v"N=3-5&1-2,6-19" -v"RS=\r?\n| " -v"ORS= " "{++d[$0]}END{split(N,g,/&/);for(l in g){split(g[l],s,/,/);delete A;for(i in s){split(s[i],r,/-/);a=r[1];b=r[2];if(b){for(j=a;j<=b;j++)A[j]}else{A[a]}};for(w in d)if(d[w] in A)print w>>(\"Z:/KZ/001/\"l\"M.txt\")}}" "Z:\KZ\001\!q!.txt"
  6. )
  7. endlocal
  8. eixt
复制代码
【注2】下列代码,运行结果为:
1.txt
B B B C C C N N N N N
2.txt
D G A A E E J J M M M M M M M M
  1. gawk -v"N=3-5&1-2,6-19" -v"RS=\r?\n| " -v"ORS= " "{++d[$0]}END{split(N,n,/&/);for(l in n){split(n[l],M,/[^0-9]+/,s);A[M[1]];for(j in s){if(s[j]==\"-\"){for(i=M[j];i<=M[j+1];i++)A[i]}else{A[M[j+1]]}};for(j in A){for(i in d)if(d[i]==j)for(k=1;k<=d[i];k++)print i>(\"Z:/KZ/001/\"l\".txt\")}delete A;delete M;delete s;}}" Z:\KZ\001\A.txt
复制代码

返回列表