Board logo

标题: [其他] 【已解决】gawk:多次提取指定个数范围的字符,如何合并完成 [打印本页]

作者: 思想之翼    时间: 7 天前 12:04     标题: 【已解决】gawk:多次提取指定个数范围的字符,如何合并完成

本帖最后由 思想之翼 于 2024-12-18 19:26 编辑

D:\A.txt 格式如下:
G B B
B C C C C C C C C C
J A A A A A
J
E E
E D E E E E
下列3行代码,分别提取 A.txt 个数范围为N=1,2-5   N=2,3-7   N=3,6-9 的字符,结果分别写入1.txt   2.txt   3.txt:
  1. gawk -v"N=1,3-5" -v"RS=\r?\n| " -v"ORS= " "{++d[$0]}END{split(N,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}}" D:\A.txt > D:\1.txt
复制代码
  1. gawk -v"N=1,4-7" -v"RS=\r?\n| " -v"ORS= " "{++d[$0]}END{split(N,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}}" D:\A.txt > D:\2.txt
复制代码
  1. gawk -v"N=3,6-9" -v"RS=\r?\n| " -v"ORS= " "{++d[$0]}END{split(N,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}}" D:\A.txt > D:\3.txt
复制代码
【问题】
上述3行代码,对 A.txt 解析了3次,如何合并代码,对 A.txt 解析1次后,分别提取N=1,2-5   N=2,3-7   N=3,6-9 的字符,写入1.txt   2.txt   3.txt
作者: aloha20200628    时间: 7 天前 17:53

回复 1# 思想之翼

眼看awk一大串 ‘长龙’,不禁批处技痒,代码如下,严格依照楼主要求,吃一遍  ‘鱼’ 吐三段 ‘骨头’ ...
  1. @echo off &setlocal &(for /f "delims=" %%a in (a.txt) do for %%x in (%%a) do echo,%%x)>-.-
  2. for /f %%a in ('sort -.-') do set/a "_#%%a+=1"
  3. for /f "tokens=1-2 delims=_#=" %%a in ('set _#') do (
  4. if %%b geq 1 if %%b leq 5 (set/p="%%a"<nul)>>1.txt
  5. if %%b geq 2 if %%b leq 7 (set/p="%%a"<nul)>>2.txt
  6. ((if %%b equ 3 set/p="%%a"<nul) & (if %%b geq 6 if %%b leq 9 set/p="%%a"<nul))>>3.txt)
  7. del/q "-.-" &pause&exit/b
复制代码

作者: hfxiang    时间: 7 天前 18:59

回复 1# 思想之翼

N不能写成3个,而是要写在一起,用&做分隔(-v"N=1,3-5&1,4-7&3,6-9")
  1. gawk -v"N=1,3-5&1,4-7&3,6-9" -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>(\"D:/\"l\".txt\")}delete A;delete M;delete s;}}" "D:\A.txt"
复制代码





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