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
之后会将结果传送到标准输出。