わかりました。どうすればいいのかわかりません。
私はfileA
次のような を持っています:
([7]RIMS_ID) : "CNR"
(refGain_A[7]) : 1
(RIMSclockBias_A[7]) : -398015316.7
(RIMSclockDrift_A[7]) : -6442.29
(RIMSclockSigma_A[7]) : .01
(RIMSclockSigY_A[7]) : 0
([8]RIMS_ID) : "ABS"
(refGain_A[8]) : 1
(RIMSclockBias_A[8]) : -374515458
(RIMSclockDrift_A[8]) : -6442.29
(RIMSclockSigma_A[8]) : .01
(RIMSclockSigY_A[8]) : 0
[インデックス] は 0 から 71 までで、各ステーションには異なる ID が付けられます。
RIMSclockBias_A
各ステーションの文字列に対応する値を、次のように別のステーションにある値に置き換えますfileB
。
CNR -44163754.49
ABS 3417370.112
...
つまり、次のようになります。
([7]RIMS_ID) : "CNR"
(refGain_A[7]) : 1
(RIMSclockBias_A[7]) : -44163754.49
(RIMSclockDrift_A[7]) : -6442.29
(RIMSclockSigma_A[7]) : .01
(RIMSclockSigY_A[7]) : 0
([8]RIMS_ID) : "ABS"
(refGain_A[8]) : 1
(RIMSclockBias_A[8]) : 3417370.112
(RIMSclockDrift_A[8]) : -6442.29
(RIMSclockSigma_A[8]) : .01
(RIMSclockSigY_A[8]) : 0
grep
ループ内でfor
とを組み合わせて正しいフィールドを分離することはできますawk
が、ファイル自体の値を置き換える方法がわかりません。 は、sed
入力として置き換えたい正確な値を知る必要があるため、実現可能ではありません。
何か案が?
答え1
これは、別の質問この場合のみ、パターンの後に一致する最初の行で置換を行う必要がありますclockBias
。特殊文字がない場合は、fileB
次のように実行できますgnu sed
。
sed -E 's|(.*)[[:blank:]](.*)|/\1/,/clockBias/{/clockBias/{s/(:[[:blank:]]{1,})(.*)/\\1\2/}}|' fileB | sed -Ef - fileA
これは単に、次の行をコマンドfileB
に変換します。sed
/CNR/,/clockBias/{/clockBias/{s/(:[[:blank:]]{1,})(.*)/\1-44163754.49/}}
そして、それらを 2 番目sed
に処理する関数に渡しますfileA
。
未知の入力の場合、特殊文字をエスケープする必要があります。左/右他の質問への回答で説明したように(今回はブレ構文):
sed 's|\(.*\)[[:blank:]]\{1,\}\(.*\)|\1\
\2|
h
s|.*\n||
s|[\&/]|\\&|g
x
s|\n.*||
s|[[\.*^$/]|\\&|g
G
s|\(.*\)\n\(.*\)|/\1/,/clockBias/{/clockBias/{s/\\(:[[:blank:]]\\{1,\\}\\)\\(.*\\)/\\1\2/}}|' fileB | sed -f - fileA