これは私のサンプルテキストファイルです。
[s] [K]
1 900
2 100
3 200
8 1000
1 80
55 12
6 90000
5 1
列2で最大値を見つけ、列1でその値を見つけて、列1のすべての要素からその値を減算する必要があります。
私が望む出力はこれです
[s] [K]
-5 900
-4 100
-3 200
2 1000
-5 80
49 12
0 90000
-1 1
これは私の断片です。
awk 'function abs(x) {return x<0?-x:x}
FNR==1 { $1=$1; print; next }
{if(max<$2){max=$2;line=$1}}{print $1-line "\t"$2}' test.txt
とにかく、これは私に正しい結果を与えません。また、列2の最小値が同じ値を持つことを望みます。
ベストアンサー1
データを2回通過し、まず最小値と最大値を見つけてから計算を実行する必要があります。
awk 'BEGIN { OFS = "\t" }
FNR == NR { if (FNR > 1 && (min == "" || $2 < min)) { min = $2; minval = $1 }
if (FNR > 1 && (max == "" || $2 > max)) { max = $2; maxval = $1 }
next }
FNR == 1 { print "[s (-max)]", "[s (-min)]", "[K]"; next }
{ print $1 - maxval, $1 - minval, $2 }' file file
与えられたデータに対して以下が生成される。
[s (-max)] [s (-min)] [K]
-5 -4 900
-4 -3 100
-3 -2 200
2 3 1000
-5 -4 80
49 50 12
0 1 90000
-1 0 1
このawk
コードには4つのブロックがあり、ここに入力ファイルを渡します。二重。最初のブロック(BEGIN
)は単に出力フィールド区切り文字をタブに設定します。
2番目のブロック()は、ファイルの最初のパス中に各行に対して実行され、2番目の列(sum)の最大値と最小値、および最初の列(sum)の対応する値をFNR == NR
追跡します。必要に応じて更新してください。このブロックの終わりで現在入力されているスクリプトの残りの部分をスキップするために使用されます。max
min
maxval
minval
next
NR
現在のレコードの完全なシーケンス番号(「行番号」)FNR
ですが、現在のファイルの番号と同じです。入力ファイルを初めて渡すのと同じですNR
。FNR
FNR == 1
3番目のブロック()は、2番目のパスファイルから最初の行を読み取ったときに実行されます。タイトルのみを出力します。最初の列の値minval
から合計値を引いた値を計算するので、新しい列見出しを追加します。maxval
最後のブロックは無条件であり、ファイルを2回目のパス中に2行目を実行し、データの実際の計算と出力を実行します。
次のようにパイプを使用すると、少しきれいな出力が得られますcolumn -s $'\t' -t
。
[s (-max)] [s (-min)] [K]
-5 -4 900
-4 -3 100
-3 -2 200
2 3 1000
-5 -4 80
49 50 12
0 1 90000
-1 0 1