GNU awk странность с индексированием массива в цикле - PullRequest
4 голосов
/ 24 марта 2019

Ранее я разрабатывал решение вопроса (на самом деле этот ), упрощенная версия:

$ echo {a..g} | tr ' ' '\n' |  # create some data
  awk  -v s=e '{               # search string as an argument
      for(i=1;i<=2;i++)        # keep 2 last records in a
          a[i]=a[i+1]          # this is the problematic part later
      a[3]=$1                  # hash the current record into a
  }
  $1==s {                      # once there is a match
      for(i=1;i<=3;i++)        # output from the hash
          print a[i]
  }'

Выход:

c
d
e

Будучи мной, я должен был попытаться сделать его на несколько байт короче (удалить i++ из for и a[i+1] -> a[++i]:

$ echo {a..g} | tr ' ' '\n' | 
gawk -v s=e '{
    # i=1; while(i<=2)  # fails with while also
    for(i=1;i<=2;)      # i++ moved
        a[i]=a[++i]     # ... here
    a[3]=$1
}
$1==s {
    for(i=1;i<=3;i++)
        print a[i]
}'

Но вывод в GNU awk завершился неудачно:

    

e

Через некоторое время удивления я переключился на mawk, и это сработало. Он также работал на Busybox awk, но не работал на awk-20121220. Есть идеи, что вызывает поведение? Кроме того, если у вас, ребята, есть более наглядное представление о названии, смело меняйте его.

1 Ответ

3 голосов
/ 24 марта 2019

С Руководство пользователя GNU Awk :

Это зависит от реализации относительно того, какое выражение вычисляется первым, слева или справа. Рассмотрим этот пример:

i = 1
a[i += 2] = i + 1

Значение a[3] может быть равно двум или четырем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...