Максимум 2-го столбца и минимум 1-го столбца, сравнивая по две строки за раз

5500 5700
5600 5800
5700 5800
5600 5900
5900 6100
5900 6100
5900 6100
5800 6000
5800 6100
5900 6100
5800 6200
5700 5800

У меня есть файл с двумя столбцами, как указано выше. Мне нужно найти min из каждых двух строк в первом столбце и max из каждых двух строк во втором столбце. Как это можно сделать с помощью awk? Желаемый результат будет

Min      Max
5500     5800
5600     5900
5900     6100
5800     6100
5800     6100
5700     6200  
0
16.05.2017, 13:56
2 ответа
$ awk 'BEGIN { print "Min", "Max" } {a=$1; b=$2; getline; print ($1<a?$1:a), ($2>b?$2:b)}' data.in
Min Max
5500 5800
5600 5900
5900 6100
5800 6100
5800 6100
5700 6200

Код awk сохраняет текущие значения в первом и втором столбцах в переменные a и b соответственно. Затем он явно считывает следующую строку и выводит минимум a и новое значение в первом столбце вместе с максимумом b и новое значение во втором столбце.

($1 < a ? $1 : a) использует тернарный оператор ?: для сравнения и выбора значения в зависимости от результата этого сравнения.

Если вы хотите вывести вывод с разделителями табуляцией:

$ awk 'BEGIN {OFS="\t"; print "Min", "Max"} {a=$1; b=$2; getline; print ($1<a?$1:a), ($2>b?$2:b)}' data.in
Min     Max
5500    5800
5600    5900
5900    6100
5800    6100
5800    6100
5700    6200
1
28.01.2020, 02:46
perl -pe '($_ .= <>) =~ s/(\d+) (\d+)\n(\d+) (\d+)/($3<$1 ? $3:$1).$".($4>$2 ? $4:$2)/e'

Добавить следующую строку в текущую запись $_, а затем сравнить поле 3<->1 для минимального и 4<->2 для максимального и поставить результаты в самой записи. После этого -p выведет результат на стандартный вывод.

0
28.01.2020, 02:46

Теги

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