зацикливание символов во входной строке с использованием awk - PullRequest
22 голосов
/ 19 декабря 2011

Верьте или нет, я не могу найти ответ на то, что, как я думаю, было бы этим самым основным вопросом.

В 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 ]

36 голосов
/ 19 декабря 2011

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

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

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

15 голосов
/ 19 декабря 2011

По умолчанию в 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
8 голосов
/ 20 декабря 2011

Не все реализации awk поддерживают вышеуказанные решения.В этом случае вы можете использовать substr :

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

PS. В некоторых awk длина реализации без аргументов по умолчанию равна $ 0 , то есть длина и длина ($ 0) эквивалентны.

2 голосов
/ 19 декабря 2011

если у вас есть 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...