Arrays 从字符串中删除所有数值
我在awk中有一个数组(vars),其中包括一组由数字和字母组成的字符串(例如px0、px2…) 我想把这些字符串拆分成数字和字母表,并将它们放入另一个二维数组(comp)Arrays 从字符串中删除所有数值,arrays,string,awk,Arrays,String,Awk,我在awk中有一个数组(vars),其中包括一组由数字和字母组成的字符串(例如px0、px2…) 我想把这些字符串拆分成数字和字母表,并将它们放入另一个二维数组(comp) px0->px,0 px2->px,2 py4->py,4 dxy17->dxy,17 我尝试使用子函数并将结果放入一个新数组 for (k=l; k<=length(vars); k++){ j=j+1;vars2[k]=vars[k]; sub(/[a-z]/,"",vars2[k]) co
px0->px,0
px2->px,2
py4->py,4
dxy17->dxy,17
我尝试使用子函数并将结果放入一个新数组
for (k=l; k<=length(vars); k++){
j=j+1;vars2[k]=vars[k];
sub(/[a-z]/,"",vars2[k])
comp[j,2]=vars2[k]
printf comp[j,2]
printf " "
sub(/[0-9]/,"",vars[k])
comp[j,1]=vars[k]
print comp[j,1]
}
我认为尝试中需要的主要内容是在
/[0-9]+/
匹配中指定+
。这里有一个替代版本,它匹配并删除留下字符串的数字
#! /usr/bin/gawk -f
BEGIN {
split("", vars)
vars[1] = "px0"
vars[2] = "px2"
vars[3] = "py4"
vars[4] = "dxy17"
print "vars[i]={px0,px2,...}-> comp[i,1]={px,px,...},comp[i,2]={0,2,...}"
print ""
split("", comp)
sz = length(vars)
for (i = 1; i <= sz; ++i) {
v = vars[i]
if (match(v, /[0-9]+/))
sub(comp[i,2] = substr(v, RSTART, RLENGTH), "", v)
comp[i,1] = v
}
for (i = 1; i <= sz; ++i)
printf("%-6s->%-4s%d\n", vars[i], comp[i,1] ",", comp[i,2])
}
替代实施方案:
我们也可以找到字符串部分并删除以保留数字,或者我们可以使用两个不同的匹配,只需在comp[]中删除每个匹配的结果。。。但无论如何,if(match())x=substr()
模式(即POSIX)是我们的朋友
如果我们使用gawk,gawk自动为我们提供
substr()
,如果我们提供match()
一个附加参数a
,substr()将被放入a[0]
。另外,gawk在这个额外的参数中添加了很多功能,了解它值得深入到man页面。请在代码标签中的帖子中发布输入和输出示例。我为您缩进了代码,但下一次,多亏您自己这么做,这是对读者的一点尊重/Anwerr拥有150+的良好声誉您应该现在就开始在您的帖子中使用代码标签,请发布您试图实现的示例。@RaymondHaffarianshirazi,在您的帖子中也添加输入和预期输出的示例。这对我们来说是一个非常长的脚本的一部分,没有什么区别。创建一个小脚本,用它自己的输入/输出示例演示您的问题(即a),如果您想得到一个好的解决方案,请将其包含在您的问题中。否则,如果您得到任何答案,那么很可能是一些半支持的废话,它做了您认为它应该做的事情,但对于您的应用程序来说确实是完全错误的。
px0 -> px, x0
#! /usr/bin/gawk -f
BEGIN {
split("", vars)
vars[1] = "px0"
vars[2] = "px2"
vars[3] = "py4"
vars[4] = "dxy17"
print "vars[i]={px0,px2,...}-> comp[i,1]={px,px,...},comp[i,2]={0,2,...}"
print ""
split("", comp)
sz = length(vars)
for (i = 1; i <= sz; ++i) {
v = vars[i]
if (match(v, /[0-9]+/))
sub(comp[i,2] = substr(v, RSTART, RLENGTH), "", v)
comp[i,1] = v
}
for (i = 1; i <= sz; ++i)
printf("%-6s->%-4s%d\n", vars[i], comp[i,1] ",", comp[i,2])
}
vars[i]={px0,px2,...}-> comp[i,1]={px,px,...},comp[i,2]={0,2,...}
px0 ->px, 0
px2 ->px, 2
py4 ->py, 4
dxy17 ->dxy,17