本帖最后由 思想之翼 于 2025-3-9 18:56 编辑
下列3行代码,分别提取 A.txt 个数范围为N=3-5 N=1-2 N=6-100 的字符,写入1.txt 2.txt- @echo off
- setlocal enabledelayedexpansion
- 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
- 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
- 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
- endlocal
- 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】下列代码,运行结果符合预期- @echo off
- setlocal enabledelayedexpansion
- for /l %%f in (1,1,500) do (
- set q=%%f
- 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"
- )
- endlocal
- 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- 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
复制代码
|