使用awk循环输入字符串中的字符

时间:2011-12-19 15:46:52

标签: string for-loop awk

信不信由你,我无法找到我认为这个基本问题的答案。

在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]; 
}'
坦率地说,我很尴尬。

4 个答案:

答案 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)spacetabs。既然你提到你想要遍历每个字符而不是字,我们将不得不重新定义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