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

3

我在 awk 中有一个数组(vars),其中包含一组由数字和字母组成的字符串(例如 px0、px2...)。 我想将这些字符串拆分为数字和字母,并将它们放入另一个二维数组(comp)中。

 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

我尝试使用 sub 函数,并将结果放入一个新数组中,

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]
}

但是 sub 只从字符串中删除一个字符。
px0 -> px, x0

1
请在您的帖子中以代码标记发布输入和输出示例的样本。 - RavinderSingh13
2
我为您缩进了代码,但下次请自行处理。这是对读者/回答者的尊重。 - Gilles Quénot
1
如果您的声誉已经达到150+,那么请在您的帖子中开始使用代码标记,并请发布您尝试实现的示例。 - RavinderSingh13
1
@RaymondGhaffarianShirazi,请在您的帖子中添加输入和期望输出的示例。 - RavinderSingh13
2
对于我们来说,这是一个非常长的脚本的一部分并不重要。创建一个带有自己示例输入/输出的小脚本,演示您的问题(即[mcve]),如果您想获得帮助提出一个好的解决方案,请在您的问题中包含它。否则,如果您得到任何答案,那么很可能是一些半吊子的废话,它做了您认为它应该做的事情,但实际上完全不适合您的应用程序。 - Ed Morton
显示剩余3条评论
1个回答

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])
}

并输出:

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

替代实现:

我们可以选择找到字符串部分并删除以保留数字,或者我们可以使用两个不同的匹配项,并且只需将每个结果放入comp[]中...但无论如何,if (match()) x = substr()模式(这是POSIX)是我们的朋友。

如果我们使用gawk,则gawk会自动为我们提供substr(),如果我们向match()提供一个额外的参数a - substr()将被放入a[0]。此外,gawk将许多功能都放入了该额外参数中,学习它值得深入研究man页面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接