Это однопроходное -решение:
/Nodes/ { read = 1 }
/EndNodes/ { read = 0 }
!read { next }
NF == 4 { n = $1; x = $2; y = $3; z = $4 }
z > max { delete set; i = 1; max = z }
x >= 0 && y == 0 && z == max { set[i++] = n }
END { for (i in set) { print set[i] } }
Переменная read
определяет, должны ли мы действовать с текущей записью или нет. Если это 1, то мы делаем.
Третий блок отбрасывает текущий ввод, если он нас не интересует, и продолжает сверху со следующей записью.
В четвертом блоке задаются четыре удобные переменные: n
, x
, y
и z
. Их приятнее читать, чем $1
и т. д.
5-й блок удаляет массив set
. Массив set
— это набор всех номеров узлов, которые мы нашли до сих пор и которые удовлетворяют критериям. Поскольку этот блок выполняется, если мы нашли новый максимум для z
, все ранее найденные узлы становятся недействительными. Также сохраняем новый максимум(max
). Переменная i
— это просто индекс в массиве (счетчик, в основном ). Если максимум еще не найден, то неинициализированный max
будет считаться нулевым в тесте.
Шестой блок выполняется, когда мы нашли узел, удовлетворяющий критериям. Номер узла сохраняется в массиве set
, а i
увеличивается.
В конце мы перебираем массив set
и выводим его содержимое.
Результат при работе под GNU awk
:
20
31
32
BSD awk
и mawk
, работающие на OpenBSD, создают список в обратном порядке.
Оказывается, мне нужно запустить контейнер в привилегированном режиме вот так:
(Также CAP_SYS_ADMIN
не было необходимости)
docker run -dt \
--tmpfs /run --tmpfs /tmp \
--volume /sys/fs/cgroup:/sys/fs/cgroup:ro \
--device=/dev/net/tun \
--cap-add NET_ADMIN \
--privileged \
<container>