awk цикл for-in дает неожиданный результат?

В настоящее время я пишу сценарий awk в сценарии bash. Один из моих аргументов нужно разделить и прокрутить. Например: для аргумента 1234 мне нужно перебрать каждое число в порядке написания. Итак, 2413 не эквивалентно.

Я использовал split для создания массива, а затем цикл for-in для циклического перемещения по массиву. Я предполагал, что он будет проходить по порядку, но это не так.

Мой код выглядит следующим образом:

split(cols,toShow,"")
for (c in toShow)
    printf "%s\n",c

cols передается команде awk с помощью опции -v и дает следующий результат:

4
1
2
3

После проверки этого несколько раз, с различной длиной аргументов и использованием как цифр, так и букв, оказалось, что цикл for начинается с элемента 4 массива, циклически проходит до конца по порядку, затем циклически проходит по элементам с 1 по 3, вместо этого ожидаемого, начиная с элемента 1 и циклически до конца.

Можно ли как-то изменить поведение или я что-то не так делаю?

EDIT Для пояснения, я использую gawk в xubuntu 11.10.


person Saladin Akara    schedule 19.05.2012    source источник


Ответы (1)


массивы в awk не (обязательно) хранятся в порядке из исходного источника.

Кроме того, использование чисел в качестве ввода сбивает с толку проблему.

Вот решение, которое иллюстрирует проблему

awk 'END{cols="ABCD";n=split(cols,toShow,"")
for (i=1;i<=n;i++)
    printf "%s\n",toShow[i] }' /dev/null

** выход**

A
B
C
D

Чтобы понять, что я имею в виду, отредактируйте свой код на ABCD, и вы по-прежнему будете получать числовой вывод, поскольку for c in toShow печатает ключи, а не значения массива assoc.

Если вы измените ABCD в моем образце на 1234, вы получите результат, который ищете.

Надеюсь, это поможет.

person shellter    schedule 19.05.2012
comment
Тот факт, что он выводил индекс, на самом деле не имел значения, поскольку он по-прежнему показывал, что он выводит не в правильном порядке, однако переход на более длинный цикл for решил проблему, так что спасибо :) - person Saladin Akara; 19.05.2012