値列の最小値と最大値を見つけて-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
あります。これが一致した場合は、最初のファイルを処理することです。つまり、このブロックは最初のファイルに対してのみ実行されます。NR
FNR
if ($1>=max) max=$1
-awk
文if
の構文は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
代わりに使用しました...)、データを印刷します。