列的最小值和最大值

时间:2018-02-19 09:23:23

标签: bash awk

示例的目的是创建一个文件,获取2列的最小值和最大值,以生成带结果的输出。

输入文件

338043.75 2395256.25 36301 38676 1296
338056.25 2395256.25 36301 38677 1296
338068.75 2395256.25 36301 38678 1296
338081.25 2395256.25 36301 38679 1296
338093.75 2395256.25 36301 38680 1296
338106.25 2395256.25 36301 38681 1296
338118.75 2395256.25 36301 38682 1296
338131.25 2395256.25 36301 38683 1296
338143.75 2395256.25 36301 38684 1296
338156.25 2395256.25 36301 38685 1296
338168.75 2395256.25 36301 38686 1296
338181.25 2395256.25 36301 38687 1296
338193.75 2395296.25 36301 38688 1296
338206.25 2395256.25 36301 38689 1296

使用此代码我得到了所需的输出

x1=`sort -k1n file | head -1 | awk '{print $1}'`
x2=`sort -k1n file | tail -1 | awk '{print $1}'`
y1=`sort -k2n file | head -1 | awk '{print $2}'`
y2=`sort -k2n file | tail -1 | awk '{print $2}'`

echo $x1","$y1 
echo $x2","$y1 
echo $x2","$y2 
echo $x1","$y2 
echo $x1","$y1

输出所需

338043.75,2395256.25
338206.25,2395256.25
338206.25,2395296.25
338043.75,2395296.25
338043.75,2395256.25

感谢您的输入,我相信有更好的方法可以获得相同的输出。

1 个答案:

答案 0 :(得分:3)

借用Ed Morton的优秀答案 - https://stackoverflow.com/a/29784278

$ awk 'BEGIN{ OFS=","; x1=x2=y1=y2="NaN" }
       { x1 = (NR==1 || $1<x1 ? $1 : x1)
         x2 = (NR==1 || $1>x2 ? $1 : x2)
         y1 = (NR==1 || $2<y1 ? $2 : y1)
         y2 = (NR==1 || $2>y2 ? $2 : y2) }
       END { print x1,y1; print x2,y1; print x2,y2; print x1,y2; print x1,y1 }' ip.txt
338043.75,2395256.25
338206.25,2395256.25
338206.25,2395296.25
338043.75,2395296.25
338043.75,2395256.25


  • x1 = (NR==1 || $1<x1 ? $1 : x1)这将为第一列提供最小数量。在NR==1(第一行)时,x将获得$1的值。对于其余行,如果第一列值小于已保存的值
  • ,则会更新x1
  • 同样,使用>比较代替<将获得最大数量。重复第二列

另外,正如RavinderSingh13在评论中提到的那样,也可以使用ORS代替调用print五次:

print x1,y1 ORS x2,y1 ORS x2,y2 ORS x1,y2 ORS x1,y1