Подтвердить что ты не робот

Цикл над символами в строке ввода с помощью 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]; 
}'

Честно говоря, я смущен.

4b9b3361

Ответ 1

Вы можете преобразовать строку в массив с помощью split:

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

Это печатает символы по вертикали, по одному на строку.

Ответ 2

По умолчанию в 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

Ответ 3

Не все реализации 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) эквивалентны.

Ответ 4

если у вас есть gawk:

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