用其他文件中的值取代文字字段

用其他文件中的值取代文字字段

好吧,我不知道該怎麼做。

我有一個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我可以透過infor循環 和的組合來隔離正確的字段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進行處理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

相關內容