Linux:将文本字段替换为其他文件中的值



好吧,我不知道该怎么做。

我有一个看起来像这样的文件A:

([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字符串的值替换为我在另一个文件 B 上的值,如下所示:

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 

我可以使用 for 循环中的 grep 和 awk 的组合来隔离 fileA 中的正确字段,但我不知道如何替换文件本身中的值。也许我应该使用Perl,但我没有任何经验。任何帮助将不胜感激。

谢谢!

在我看来

,可读性稍微强一点:

BEGIN { FS = " *:? *" }
NR == FNR { bias[""" $1 """] = $2; next }
/RIMS_ID/ { key = $2; }
/RIMSclockBias_A/ { sub($2, bias[key]); }
{ print }

现在,如果您想将替换限制为一定范围的 ID,例如 57 到 64,您可以使用如下所示的内容:

BEGIN { FS = " *:? *" }
NR == FNR { bias[""" $1 """] = $2; next }
/RIMS_ID/ { key = $2; }
/[57]RIMS_ID/ { substitute = 1 }
/[65]RIMS_ID/ { substitute = 0 }
/RIMSclockBias_A/ && substitute { sub($2, bias[key]); }
{ print }

因此,一旦遇到 ID 57,我们就将 substitute 设置为 true,一旦遇到 ID 65,我们就将 substitute 设置为 false,并且我们仅在该变量为 true 时执行替换。

一个不太健壮的awk脚本

$ awk -v q='"' 'NR==FNR{a[q $1 q]=$2;next} 
                $3 in a{v=a[$3]; f=1} 
   /(RIMSclockBias_A[[0-9]+])/ && f {sub($3,v); f=0}1' map file
([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

其中 file 是数据文件,映射是查找值。 假设您的结构是固定的(字段数、间距和字段顺序等相同)。

$ cat tst.awk
NR==FNR { map["""$1"""]=$2; next }
/^([/ { key = $NF }
/^(RIMSclockBias_A[/ && key in map { sub(/[^[:space:]]+[[:space:]]*$/,map[key]) }
{ print }
$ awk -f tst.awk fileB fileA
([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

相关内容

最新更新