
まあ、どうすればいいのかわかりません。
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
grep
for
inループとの組み合わせで正しいフィールドを分離できますが、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