Arrays 从字符串中删除所有数值

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

我在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])
    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)是我们的朋友


如果我们使用gawkgawk自动为我们提供
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