1

我想使用 Bash 中的 AWK 返回在 CSV x、y 数据的指定 x 值范围内观察到的最小 y 值。所以,具体来说,我可能有如下数据:

xyData="10, 100
20, 200
30, 300
40, 400
50, 500
60, 600
70, 700
80, 800
90, 900
100, 1000"

我想问一个诸如以下的问题:在从 x 值 50 开始到 x 值 90 结束的点范围内观察到最小 y 值的点是什么?此示例的答案是“50, 500”,因为 500 是在从 x 值 50 开始并以 x 值 90 结束的点的包容范围内观察到的最小 y 值。

我对AWK很陌生。是否有一些巧妙的方法可以实现这一点?非常感谢您在这方面的帮助。

4

3 回答 3

1
awk -F, '$1>=50 && $1<=90{if(!i){i=$1;m=$2}else if(($2+0)<m){m=$2;i=$1}}END{print i","m}' file.csv

输出:

50, 500
于 2013-03-04T15:30:10.863 回答
1

一种方法(编辑:有错误的解决方案,请参阅Scrutinizer 的评论):

awk -F'[, ]+' '
  $1 >= 50 && $1 <= 90 { 
    if (y > $2 || y == 0) { 
      y = $2; x = $1 
    } 
  } 
  END { 
    printf "%s, %s\n", x, y 
  }
' infile

它产生:

50, 500

根据Scrutinizer的评论更新解决方案:

awk -F'[, ]+' '
  $1 >= 50 && $1 <= 90 { 
    if (y > $2 || !y_set) { 
      y = $2 
      x = $1
      y_set = 1
    } 
  } 
  END {
    if ( x || y ) {
      printf "%s, %s", x, y 
    }
  }
' infile
于 2013-03-04T15:34:53.440 回答
0

另一个尝试,假设 x 点按顺序列出:

awk '$1>e{exit} $1>=b && ($2<=m || !s){s=1; m=$2; n=$1} END{print n,m}' b=50 e=90 FS=, OFS=, file
于 2013-03-04T17:19:08.697 回答