Использование awk для вычисления "rolling max" и печати соответствующей записи из колонки 2

В bash / ksh и подобных, вы можете использовать <() , чтобы избежать подоболочки, которая ] | создает:

insourcable.sh :

echo hallo welt
echo hello world
echo ahoj světe

Предположим, вы хотите вставить в исходный код только строку номер два:

. <( sed -n '2 p' < insourcable.sh )

(выводит «привет, мир»)

1
29.06.2018, 04:11
2 ответа

Я не думаю, что цикл по полям — это то, что вам здесь нужно. Вместо этого просто посмотрите на номер записи (или номер записи файла, чтобы он мог работать с несколькими файлами )по модулю 5 :

.
$ awk '!((FNR-1)%5) || $2 > max {x = $0; max = $2} !(FNR%5) {print x}' file
3   279
7   479
  • если FNRравно 1,6,... ИЛИ $2больше, чем текущий текущий максимум, сохранить текущую строку / максимум

  • если FNRравно 5,10,... вывести текущую строку / макс.

0
28.01.2020, 00:33

Не awkответ, но для тех, кто любит инструменты оболочки, этот метод GNUsplitработает:

split -l 5 --filter 'sort -n -k 2 | tail -1'  file
0
28.01.2020, 00:33

Теги

Похожие вопросы