我在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
答案 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 页面。