Board logo

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

作者: 思想之翼    时间: 2024-12-17 19:39     标题: 【已解决】gawk:如何全部提取指定个数范围的字符

本帖最后由 思想之翼 于 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
作者: hfxiang    时间: 2024-12-17 19:49

回复 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
复制代码

作者: 思想之翼    时间: 2024-12-17 22:18

本帖最后由 思想之翼 于 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
作者: Five66    时间: 7 天前 01:53

本帖最后由 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
作者: hfxiang    时间: 7 天前 08:59

回复 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
复制代码





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