入力サンプル
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
配列を順番に繰り返し、逆順に印刷して最後にカウンタをリセットします。a
b
n
これは(1)ミラーポイントが実際に中央にあると仮定する。 (2)各ブロックの最初のフィールドは常に同じです(コードと同様)。 (3) 各ブロックの後には空行があります。追加の空行は重要ではありません。空行がない場合は、最後に1つを追加します。