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
$ 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
perl -pe '($_ .= <>) =~ s/(\d+) (\d+)\n(\d+) (\d+)/($3<$1 ? $3:$1).$".($4>$2 ? $4:$2)/e'
Добавить следующую строку в текущую запись $_
, а затем сравнить поле 3<->1 для минимального и 4<->2 для максимального и поставить результаты в самой записи. После этого -p
выведет результат на стандартный вывод.