Awk将字符串拆分为单词和数字



我正在尝试拆分字母和数字边界,但使用查找的解决方案失败:

echo 50cats30dogs100squirrels | awk '{split($0,a,/(?<=D)(.*)(?=d)/); print a[1],a[2],a[3]}'
awk: illegal primary in regular expression (?<=D)(.*)(?=d) at <=D)(.*)(?=d)
source line number 1
context is
>>> {split($0,a,/(?<=D)(.*)(?=d)/) <<<

在Awk中有其他方法可以做到这一点吗?

编辑:

很抱歉没有说清楚。预期的输出是像这样添加空格:

50 cats 30 dogs 100 squirrels

仅显示示例。请尝试以下,如果这是你正在寻找。在GNUawk中编写和测试(我相信应该可以在任何awk中工作)。

echo "50cats30dogs100squirrels" | awk '{gsub(/[^0-9]+/," & ")} 1'

所示示例的输出如下所示:

50 cats 30 dogs 100 squirrels

是否有一种方法可以在Awk中以其他方式做到这一点?

我将使用GNUAWK来完成这个任务,让file.txt内容为

50cats30dogs100squirrels

然后

awk 'BEGIN{FPAT="([[:alpha:]]+)|([[:digit:]]+)"}{$1=$1;print}' file.txt

输出
50 cats 30 dogs 100 squirrels

解释:我使用FPAT指示AWK列是(一个或多个字母)或(一个或多个数字)。然后我做$1=$1导致字符串重建(没有$1=$1;输出将与输入相同)和print它。

(在gawk 4.2.1中测试)

(?<=D)(.*)(?=d)为PCRE。没有POSIX标准定义的强制Unix工具支持pcre。awk特别支持EREs。

使用GNU awk for FPAT:

$ echo '50cats30dogs100squirrels' | awk -v FPAT='[0-9]+|[^0-9]+' '{$1=$1}1'
50 cats 30 dogs 100 squirrels

你可以试试:

echo 50cats30dogs100squirrels | awk '{while (match($0, /[0-9]+|[a-zA-Z]+/)) {print substr($0, RSTART, RLENGTH);$0=substr($0, RSTART+RLENGTH)}}'

收益率:

50
cats
30
dogs
100
squirrels

使用gawk,这是gensub的工作,然后将split放入数组更容易:

gawk '
BEGIN {
s = "50cats30dogs100squirrels"
t = gensub(/[[:alpha:]]+|[[:digit:]]+/, "& ", "g", s)
print ">" t "<"
split(t, a)
for (i in a) print i, a[i]
}
'

输出
>50 cats 30 dogs 100 squirrels <
1 50
2 cats
3 30
4 dogs
5 100
6 squirrels

最新更新