проблема awk / gawk asorti ()
-
28-09-2019 - |
Вопрос
Я получил следующую проблему с функцией Asorti Gawk:
gawk 'BEGIN{ \
a[1]=6; \
a[2]=7; \
a[3]=8; \
a[21]=9; \
a[123]=10; \
t=asorti(a, o); \
for (i=1; i<=t; i++) { \
print i,o[i]; \
} \
}'
Результатом является:
1 1
2 123
3 2
4 21
5 3
Таким образом, это довольно ясно awk, сортированные индексы в лексикографическом порядке, но Док awk говорит (asort (s [, d])):
«Содержание S сортируется с использованием нормальных правил GAWK для сравнения значений ...»
Однако, когда я копирую себя в массиве TEMP и сортировать этот новый массив с помощью Asort (),
Кажется, хорошо (используя что-то вроде):
j=1; for(e in a) { temp[j++] = e; }
Я делаю это - неправильно, или это проблема с асортизатором Gawk ()?
Решение
Согласно Руководство Gawk: «Важный аспект о массивах, чтобы помнить, так это то, что Массивные подписки всегда строки."
Другие советы
Я знаю, что были ограничения на GAWK 3, но на Gawk 4 (по крайней мере, на 4.1.1) это тривиально:
t=asorti(a, o, "@ind_num_asc");
Как обходной путь, вы можете использовать что-то вроде этого (вам может потребоваться отрегулировать прокладку):
gawk 'BEGIN {
a[1] = 6; a[2] = 7; a[3] = 8; a[21] = 9; a[123] = 10;
for (i in a) io[sprintf("%15s", i)] = a[i]
t = asorti(io, o)
for (i = 0; ++i <= t;) print i, o[i] + 0
}'
С GNU awk вы можете даже сохранить оригинальные клавиши / индексы:
WHINY_USERS=oops gawk 'BEGIN {
a[1]=6; a[2]=7; a[3]=8; a[21]=9; a[123]=10;
for (i in a) o[sprintf("%15s", i)] = a[i]
for (i in o) print i + 0, o[i]
}'