Ранее я разрабатывал решение вопроса (на самом деле этот ), упрощенная версия:
$ 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. Есть идеи, что вызывает поведение? Кроме того, если у вас, ребята, есть более наглядное представление о названии, смело меняйте его.