【问题标题】:Remove all numerical values from a string从字符串中删除所有数值
【发布时间】:2018-09-10 11:05:13
【问题描述】:

我在 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

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

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

【问题讨论】:

  • 请在您的帖子中的代码标签中发布输入和输出示例。
  • 我为你缩进了代码,不过下次还是自己动手吧,有点尊重读者/回答者
  • 拥有 150+ 的良好声誉,您现在应该开始在您的帖子中使用代码标签,请发布您想要达到的目标的示例。
  • @RaymondGhaffarianShirazi,在您的帖子中添加输入和预期输出示例。
  • 这对我们来说是一个非常长的脚本的一部分,这对我们没有任何影响。创建一个带有自己的示例输入/输出的小脚本来演示您的问题(即minimal reproducible example),如果您希望帮助提出一个好的解决方案,请将其包含在您的问题中。否则,如果您根本没有得到任何答案,那么很可能是一些半支持的废话,做了您认为应该做的事情,但对您的应用程序来说确实是完全错误的。

标签: arrays string awk


【解决方案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,如果我们提供 match() 一个附加参数 agawk 会自动为我们提供 substr() - substr()将被放入a[0]。此外,gawk 在该额外参数中添加了很多功能,因此值得深入了解它的 ma​​n 页面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2021-06-16
    • 1970-01-01
    • 2010-11-04
    相关资源
    最近更新 更多