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

时间:2016-05-23 16:04:52

标签: linux awk scripting text-processing

好吧,我无法弄清楚如何做到这一点。

我有一个看起来像这样的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字符串对应的值替换为我在另一个文件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循环和awk中的grep组合来隔离fileA中的正确字段,但我不知道如何替换文件本身中的值。 也许我应该使用Perl,但我没有任何经验。 任何帮助将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:1)

不太强大的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是数据文件,map是查找值。假设您的结构是固定的(相同数量的字段,间距和字段顺序等)。

答案 1 :(得分:1)

在我看来,稍微更具可读性:

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,我们只执行替换该变量是真的。

答案 2 :(得分:0)

$ 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