Цикл над символами в строке ввода с помощью 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];
}'
Честно говоря, я смущен.
Ответы
Ответ 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