loop over characters in input string using awk

前端 未结 4 458
抹茶落季
抹茶落季 2020-12-10 01:31

Believe it or not, I can\'t find the answer to what I would think would be this very basic question.

In awk, how can I loop over the input string character by charac

相关标签:
4条回答
  • 2020-12-10 01:37

    if you have gawk:

    awk '$0=gensub(/(.)/,"\\1\n","g")' file
    

    test:

    kent$  echo "I am a String"|awk '$0=gensub(/(.)/,"\\1\n","g")'
    I
    
    a
    m
    
    a
    
    S
    t
    r
    i
    n
    g
    
    0 讨论(0)
  • 2020-12-10 01:46

    By default in awk the Field Separator (FS) is space or tabs. Since you mentioned you wanted to loop over each character and not word, we will have to redefine the FS to nothing. Something like this -

    [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
    
    0 讨论(0)
  • 2020-12-10 01:46

    Not all awk implementations support the above solutions. In that case you could use substr:

    echo here is a string | awk '{
      for (i=0; ++i <= length($0);) 
        printf "%s\n", substr($0, i, 1)
      }'
    

    P.S. In some awk implementations length without arguments defaults to $0, i.e. length and length($0) are equivalent.

    0 讨论(0)
  • 2020-12-10 01:55

    You can convert a string to an array using split:

    echo "here is a string" | awk '
    { 
      split($0, chars, "")
      for (i=1; i <= length($0); i++) {
        printf("%s\n", chars[i])
      }
    }'
    

    This prints the characters vertically, one per line.

    0 讨论(0)
提交回复
热议问题