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

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)

这将垂直打印字符,每行一个.

  • @vaxquis 我不确定你所说的“纯”awk 是什么意思,但是 `length` 在 POSIX 中。gawk 扩展适用于数组而不是字符串。幸运的是,我们可以将 `length(chars)` 切换为 `length($0)`。 (2认同)
  • "纯粹的"awk意思是"没有任何扩展的awk"......是的,我的意思是这种用法的长度(); 另外,你可以使用"len = split(...)"和后来的"i <= len",结果相同. (2认同)

jay*_*ngh 16

默认情况下,在awkField Separator (FS)IS 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
Run Code Online (Sandbox Code Playgroud)

  • 这是因为在使用默认FS之前已经读过第一行. (3认同)
  • AFAIK,您可以在代码中设置FS =“”,而无需在其外部使用... (2认同)
  • @vaxquis你必须在BEGIN中做:''BEGIN {FS ="";}}`` (2认同)

Dim*_*lov 8

并非所有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)是等价的.