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

标签 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。

我想用我在另一个文件 B 上的值替换每个站的 RIMSclockBias_A 字符串对应的值,如下所示:

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,然后我们仅在该变量为真时执行替换。

关于Linux:用其他文件中的值替换文本字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37395666/

相关文章:

bash - 如何有条件地向 shell 脚本添加标志?

linux - 如何正确地将文件的一行读入数组?

linux - 在多显示器设置上设置 QWidget 全屏

linux - 为什么在删除关联的 *.py 文件时删除 *.pyc 文件

linux - 使查找命令不区分大小写

linux - 使用 grep、sed 或 awk 解析字符串

mysql - 在 sql 数据库上使用 awk 更改所有 iframe "width"和 "height"大小

Linux grep 命令,相关值作为输出

linux - 如何使用 unix 命令将文本文件中的列打印为按行?

python - ANT 没有得到 python 脚本返回的退出代码