中間線を超えるデータポイントをどのように反映しますか?

中間線を超えるデータポイントをどのように反映しますか?

入力サンプル

file name
0.00   -1.0000   number1
0.00   -0.8000   number2
0.00   -0.6000   number3
0.00   -0.4000   number4
0.00   -0.2000   number5
0.00   0.0000   number6
0.00   0.2000   number7
0.00   0.4000   number8
0.00   0.6000   number9
0.00   0.8000   number10
0.00   1.0000   number11

0.02   -1.0000   number12
0.02   -0.8000   number13
0.02   -0.6000   number14
0.02   -0.4000   number15
0.02   -0.2000   number16
0.02   0.0000   number17
0.02   0.2000   number18
0.02   0.4000   number19
0.02   0.6000   number20
0.02   0.8000   number21
0.02   1.0000   number22

0.04   -1.0000   number23
0.04   -0.8000   number24
0.04   -0.6000   number25
0.04   -0.4000   number26
0.04   -0.2000   number27
0.04   0.0000   number28
0.04   0.2000   number29
0.04   0.4000   number30
0.04   0.6000   number31
0.04   0.8000   number32
0.04   1.0000   number33

ターゲット

(引用する列/フィールドawk命名法では、$ 1 =フィールド1です。

ご覧のとおり、3つのデータがあります。各ブロックでは、$ 1は定数値と同じです。 $1 = 定数である各ブロックに対して $2 = 0 を中心に $3 を対称的に交換したいと思います。結果は次のような望ましい出力になります。

希望の出力

file name
0.00   -1.0000   number11
0.00   -0.8000   number10
0.00   -0.6000   number9
0.00   -0.4000   number8
0.00   -0.2000   number7
0.00   0.0000   number6
0.00   0.2000   number5
0.00   0.4000   number4
0.00   0.6000   number3
0.00   0.8000   number2
0.00   1.0000   number1

0.02   -1.0000   number22
0.02   -0.8000   number21
0.02   -0.6000   number20
0.02   -0.4000   number19
0.02   -0.2000   number18
0.02   0.0000   number17
0.02   0.2000   number16
0.02   0.4000   number15
0.02   0.6000   number14
0.02   0.8000   number13
0.02   1.0000   number12

0.04   -1.0000   number33
0.04   -0.8000   number32
0.04   -0.6000   number31
0.04   -0.4000   number30
0.04   -0.2000   number29
0.04   0.0000   number28
0.04   0.2000   number27
0.04   0.4000   number26
0.04   0.6000   number25
0.04   0.8000   number24
0.04   1.0000   number23

背景コンテキスト

実際の入力では、$1 は {0.00..0.02..15.0} の順に続きます。また、各ブロックで $2 は {-14..0.2..14} 形式に移動します。したがって、合計751個のブロックがあり、各ブロックには独自に141行(または各ブロックの前に追加のヘッダー/空行を含む142行)が含まれます。

したがって、751個のブロックを1つずつ通過し、単一ブロックの中間線(各ブロックの71行または72行)を中心に対称的にそのブロックのランダム値である$ 3を反映できるスクリプトがあれば非常に役立ちます。各ブロックの上の空行を含む)。

ありがとうございます!

ベストアンサー1

これを次に示します。しかし、awkが言及されているので使用できることを願っています。

$ awk -vn=0 'NR == 1 {print; next}
             $0 != "" { k = $1; a[n] = $2; b[n] = $3; n++ } 
             $0 == "" { for (i = 0; i < n ; i++) { 
                           printf "%s   %s   %s\n", k, a[i], b[n-i-1]; } 
                        n=0; print   }' < data

最初の行(NR == 1)では印刷して続行します。

次に、空でない行の場合は2番目と3番目のフィールドを配列にロードしa、空の行の場合はb配列を順番に繰り返し、逆順に印刷して最後にカウンタをリセットします。abn

これは(1)ミラーポイントが実際に中央にあると仮定する。 (2)各ブロックの最初のフィールドは常に同じです(コードと同様)。 (3) 各ブロックの後には空行があります。追加の空行は重要ではありません。空行がない場合は、最後に1つを追加します。

おすすめ記事