在特定范围内使用AWK查找最大值和最小值

3

我有一个包含三列的文件, 我想用 awk 获取 $3 的最大值和 $2 的最小值,但是限定在特定范围内的 $1

Col1 Col2 Col3
==============
X    1    2
X    3    4
Y    5    6
Y    7    8

例如,我想获取 Col2 的最小值,以及在 Col1=X 的情况下 Col3 的最大值。

我可以处理最大和最小值,但我不知道如何在特定范围内查找它。这是我的代码:

awk ' min=="" || $2 < min {min=$2; minline=$0} $3 > max {max=$3; maxline=$0};END {print $1,min,max}'

我尝试添加{If($1==X)},但它并没有很好地工作。
3个回答

3
kent$  echo "X    1    2
X    3    4
Y    5    6
Y    7    8
"|awk '$1=="X"{min=$2<min||min==""?$2:min;max=$3>max||max==""?$3:max}END{print min,max}'
1 4

这是您想要的吗?


好的一行代码!您能解释一下 ||min==""?$2:min 这部分是什么意思吗? - massisenergy
@massisenergy 这是 a = boolean? foo : bar,即 min= (........)? $2: min - Kent

2

那么:

awk 'BEGIN { c=1 }
     $1 == "X" { if (c==1) { mmin=$2; mmax=$3 ;c++ }
                 if ($2<mmin) { mmin=$2 }
                 if ($3>mmax) { mmax=$3 }
     } 
     END { print "X min: " mmin ", max: " mmax }' INPUTFILE

在 Ideone 上查看它的运行效果


2

如果你想收集所有的最小值和最大值:

awk '
  $2 < min[$1] {min[$1] = $2}
  $3 > max[$1] {max[$1] = $3}
  {col1[$1] = 1}
  END {for (c in col1) {print c, min[c], max[c]}}
' file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接