Вопрос

Я получил следующую проблему с функцией 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]
    }'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top