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

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

[复制链接]
发表于 2024-12-18 12:04:58 | 显示全部楼层 |阅读模式
本帖最后由 思想之翼 于 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

评分

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

查看全部评分

发表于 2024-12-18 17:53:21 | 显示全部楼层
回复 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
复制代码

评分

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

查看全部评分

发表于 2024-12-18 18:59:21 | 显示全部楼层
回复 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"
复制代码

评分

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

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 15:08 , Processed in 0.019869 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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