第二列的最大值和第一列的最小值,一次比较两行

第二列的最大值和第一列的最小值,一次比较两行
5500 5700
5600 5800
5700 5800
5600 5900
5900 6100
5900 6100
5900 6100
5800 6000
5800 6100
5900 6100
5800 6200
5700 5800

我有一个包含两列的文件,如上所述。我需要找出第一列中每两行的最小值和第二列中每两行的最大值。使用 awk 如何实现?期望的输出是

Min      Max
5500     5800
5600     5900
5900     6100
5800     6100
5800     6100
5700     6200  

答案1

$ 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

答案2

perl -pe '($_ .= <>) =~ s/(\d+) (\d+)\n(\d+) (\d+)/($3<$1 ? $3:$1).$".($4>$2 ? $4:$2)/e'

将下一行追加到当前记录中$_,然后比较字段 3<->1(最小值)和 4<->2(最大值),并将结果放入记录本身中。-p之后会将结果传送到标准输出。

相关内容