从字符串

时间:2018-03-31 18:02:27

标签: arrays string awk

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

1 个答案:

答案 0 :(得分: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 页面。