値列の最小/最大を検索し、その値をすべての列番号に追加するにはどうすればよいですか?

値列の最小/最大を検索し、その値をすべての列番号に追加するにはどうすればよいですか?

値列の最小値と最大値を見つけて-1*min()値をすべての列値に追加する(効果的に私のデータをゼロにする)、このawkコマンドの正しい構文が見つからないようです。 )。どんな助けでも大変感謝します!とても感謝しています!

awk 'NR==1 {max=$2; min=$2} $2>=max {max=$2} $2<=min {min=$2}' <  my_data.dat | awk '{printf("%-5d%+13.5f \n", NR, $2+(-1*min))}'  > my_new_data.dat

ベストアンサー1

複数のファイルと同じ構文を使用してファイルを2回参照でき、同じファイルは2回しか使用できません。

awk 'NR==1 { max=$1 ; min=$1 }
     FNR==NR { if ($1>=max) max=$1 ; $1<=min?min=$1:0 ; next}
     { $2=($1-min)/(max-min) ; print }' file file

上海:

NR==1 { max=$1 ; min=$1 }- すでに実行した最初のレコードの値を取得します。

FNR==NR- 複数の入力ファイルの場合は、レコード全体のインデックス番号の値(つまり、すべてのファイルがリンクされているかのように)と現在のファイルのレコードインデックス番号の値がawkあります。これが一致した場合は、最初のファイルを処理することです。つまり、このブロックは最初のファイルに対してのみ実行されます。NRFNR

if ($1>=max) max=$1-awkifの構文はif (condition) action ; else if (condition) action ; else action明確if elseで、else文はオプションです。

$1<=min?min=$1:0- および代替ifステートメントの構文:condition?yes-action:no-action.これには他の操作が必要なので意味がありません0。ちょうどあなたの興味のためです。

next- 2番目のファイルに対してのみ次のブロックが実行されるように、次のファイルにジャンプします。

$2=($1-min)/(max-min) ; print- [0,1] を正規化して(あなたの例では役に立たないのでmax代わりに使用しました...)、データを印刷します。

おすすめ記事