テキストフィールドを他のファイルの値に置き換える

テキストフィールドを他のファイルの値に置き換える

わかりました。どうすればいいのかわかりません。

私は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

関連情報