jas*_*ose 22 string awk for-loop
信不信由你,我找不到我认为这个基本问题的答案.
在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];
}'
Run Code Online (Sandbox Code Playgroud)
坦率地说,我很尴尬.
Mic*_*ber 36
您可以使用以下命令将字符串转换为数组split:
echo "here is a string" | awk '
{
split($0, chars, "")
for (i=1; i <= length($0); i++) {
printf("%s\n", chars[i])
}
}'
Run Code Online (Sandbox Code Playgroud)
这将垂直打印字符,每行一个.
jay*_*ngh 16
默认情况下,在awk该Field Separator (FS)IS 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
Run Code Online (Sandbox Code Playgroud)
并非所有awk实现都支持上述解决方案.在这种情况下,您可以使用substr:
echo here is a string | awk '{
for (i=0; ++i <= length($0);)
printf "%s\n", substr($0, i, 1)
}'
Run Code Online (Sandbox Code Playgroud)
PS在一些awk实现中,不带参数的长度默认为$ 0,即长度和长度($ 0)是等价的.