проблема awk / gawk asorti () - PullRequest
       30

проблема awk / gawk asorti ()

2 голосов
/ 21 июня 2010

У меня возникла следующая проблема с функцией gask asorti:

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Док говорит (asort (s [, d])):

"Содержимое s сортируется с использованием обычных правил gawk для сравнения значений ..."

Однако, когда я копирую индексы во временный массив и сортирую этот новый массив с помощью asort (),

кажется, что все в порядке (используя что-то вроде):

j=1; for(e in a) { temp[j++] = e; }

Я ДЕЙСТВУЮ-НЕПРАВИЛЬНО, или это проблема с asorti gawk ()?

Ответы [ 3 ]

3 голосов
/ 25 апреля 2015

Я знаю, что были ограничения на gawk 3, но на gawk 4 (по крайней мере на 4.1.1) это тривиально:

t=asorti(a, o, "@ind_num_asc");
3 голосов
/ 21 июня 2010

Согласно руководству gawk : "Важный аспект, который следует помнить о массивах, заключается в том, что подписки на массивы всегда являются строками. "

0 голосов
/ 22 июня 2010

В качестве обходного пути вы можете использовать что-то вроде этого (вам может понадобиться настроить отступ):

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]
    }'
...