【问题标题】:Minimum and maximum from columns列的最小值和最大值
【发布时间】:2018-02-19 19:10:23
【问题描述】:

该示例的目的是创建一个文件,获取 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 列和第 2 列的最小值和最大值被嵌入到所需的输出中
  • 我相信你需要每行的最小值和最大值,所以根据我给出的解决方案,请检查一次,如果有帮助,请告诉我。
  • @RavinderSingh13 OP 提到了getting the minimum and maximum for 2 columns ...所以它不是基于行的,而是基于列的.. 仅对于前两列,其余的被忽略
  • @Sundeep,谢谢 Sundeep 我明白了,谢谢。

标签: bash awk


【解决方案1】:

借鉴 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&lt;x1 ? $1 : x1) 这将为第一列提供最小数量。当NR==1(第一行)时,x 将获得$1 的值。对于其余行,如果第一列值小于已保存的值,x1 将被更新
  • 同样,使用&gt; 比较而不是&lt; 将给出最大数量。重复第二列

另外,正如 RavinderSingh13 在 cmets 中提到的,ORS 也可以用来代替调用 print 五次:

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

【讨论】:

  • 很棒的代码,请您解释一下代码如何获得最小值和最大值。
  • 很棒的代码,请您解释一下代码如何获得最小值和最大值。
  • Sundeep,恕我直言,您可以使用 ORS 在 awk 中获取新行,而不是在其中包含太多 print
  • RavinderSingh13,您能告诉我如何使用 ORS 来减少打印量
猜你喜欢
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
相关资源
最近更新 更多