我正在尝试拆分字母和数字边界,但使用查找的解决方案失败:
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