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

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ポイントが順番にリストされていると仮定して、もう1つ試してみてください。

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 に答える