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

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

まあ、どうすればいいのかわかりません。

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     

等、[index] 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 

grepforinループとの組み合わせで正しいフィールドを分離できますが、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/}}

sedその後、処理のために2番目の項目に渡されます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

関連情報