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

[文本处理] 【已解决】gawk:如何全部提取指定个数范围的字符

[复制链接]
发表于 2024-12-17 19:39:32 | 显示全部楼层 |阅读模式
本帖最后由 思想之翼 于 2024-12-18 08:28 编辑

D:\JZ\A.txt  每行记录若干字符,格式如下:
G B B
B C
J A A A A
J
E
E D E E E E
下列代码,提取个数范围为2-4,6的字符:
  1. gawk -v"N=2-4,6" -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)print i}}" D:\JZ\A.txt > D:\JZ\B.txt
复制代码
结果为:
J B A E

【问题】
如何使用gawk,全部提取指定个数范围的字符,结果为:
J J B B B A A A A E E E E E E

评分

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

查看全部评分

发表于 2024-12-17 19:49:23 | 显示全部楼层
回复 1# 思想之翼

  1. gawk -v"N=2-4,6" -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<=j;k++)print i}}" D:\JZ\A.txt > D:\JZ\B.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢!结果正确

查看全部评分

 楼主| 发表于 2024-12-17 22:18:21 | 显示全部楼层
本帖最后由 思想之翼 于 2024-12-18 00:40 编辑

回复 2# hfxiang

感谢帮助! 实际运用中,遇到新问题。
  1. gawk -v"N=2,100-200" -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<=j;k++)print i}}" D:\A.txt > D:\B.txt
复制代码
提取下列A.txt数值,结果为:J J E E
想要的结果为:J J E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E

A.txt
G B B A A
B C
J A A
J
E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E
E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E
发表于 2024-12-18 01:53:58 | 显示全部楼层
本帖最后由 Five66 于 2024-12-18 02:18 编辑

回复 3# 思想之翼


   
将 for(k=1;k<=j;k++)print i 那部分中的
k<=j
换成
k<=int(j)

或者将
k=1;k<=j
换成
k=0;k!=j

或者整个换成
for(k=int(j);k>0;k--)print i

评分

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

查看全部评分

发表于 2024-12-18 08:59:51 | 显示全部楼层
回复 3# 思想之翼

试试这个

  1. gawk -v"N=2,100-200" -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:\B.txt
复制代码

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2026-3-17 14:10 , Processed in 0.019786 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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