信不信由你,我无法找到我认为这个基本问题的答案。
在awk中,我如何逐个字符地循环输入字符串?假设我只想将它们打印出来。我可以访问一个数组吗?或者我需要使用substr?
基本上是这样的:
echo "here is a string" | awk '
{ for(i=0; i<[length of input string]; i++)
printf [value at index i in array x];
}'
坦率地说,我很尴尬。
答案 0 :(得分:36)
您可以使用split
将字符串转换为数组:
echo "here is a string" | awk '
{
split($0, chars, "")
for (i=1; i <= length($0); i++) {
printf("%s\n", chars[i])
}
}'
这会垂直打印字符,每行一个。
答案 1 :(得分:15)
默认情况下,awk
Field Separator (FS)
为space
或tabs
。既然你提到你想要遍历每个字符而不是字,我们将不得不重新定义FS。像这样的东西 -
[jaypal:~/Temp] echo "here is a string" | awk -v FS="" '
{for (i=1;i<=NF;i++) printf "Character "i": " $i"\n"}'
Character 1: h
Character 2: e
Character 3: r
Character 4: e
Character 5:
Character 6: i
Character 7: s
Character 8:
Character 9: a
Character 10:
Character 11: s
Character 12: t
Character 13: r
Character 14: i
Character 15: n
Character 16: g
答案 2 :(得分:8)
并非所有awk实现都支持上述解决方案。 在这种情况下,您可以使用 substr :
echo here is a string | awk '{
for (i=0; ++i <= length($0);)
printf "%s\n", substr($0, i, 1)
}'
P.S。在一些 awk 实现中,不带参数的长度默认为 $ 0 , 即长度和长度($ 0)是等价的。
答案 3 :(得分:2)
如果你有傻瓜:
awk '$0=gensub(/(.)/,"\\1\n","g")' file
试验:
kent$ echo "I am a String"|awk '$0=gensub(/(.)/,"\\1\n","g")'
I
a
m
a
S
t
r
i
n
g