【发布时间】:2021-11-13 12:06:47
【问题描述】:
我有两个文件,FILE1 包含很多行,FILE2 包含 KEY VALUE 参数。我需要将FILE2 与FILE1 进行比较,如果匹配,则FILE1 中的相应单词应替换为FILE2 中的下一列。
例子:
文件1:
<SOME YAML CODE
-------------->
PARM1
value:PARM2
PARM3
somyaml_PARM4
<END OF YAML CODE
---------------->
文件2:
PARM1 mmddyy
PARM2 hhmmss
PARM3 awsid
PARM4 cc
因此,对于FILE1 中来自FILE2 的每个匹配项,FILE1 中的相应单词应替换为FILE2 中的第二列。所以所需的输出应该是:
<SOME YAML CODE
-------------->
**mmddyy**
value:**hhmmss**
**awsid**
somyaml_**cc**
<END OF YAML CODE
---------------->
在其他社区的帮助下,我能够在命令下运行,但它仅在搜索条件位于行首时才有效
awk '
NR==FNR{k[$1]=$2;}
NR!=FNR{if($1 in k){$0=k[$1]};print}
' file2 file1
【问题讨论】:
-
请正确格式化您的问题。提示:试试
{}按钮。 -
另外请注意,您需要一个 YAML 解析器,因为基于 Regex 的 shell 工具都不适合处理复杂的数据结构,例如 YAML、JSON、XML/HTML/SGML……解析如 Python、Ruby、Perl……
-
执行示例中显示的操作很简单。如果您的某些 PARM 可能是其他 PARM 的子集(例如 PARM2 在 file2 但 PARM20 在 file1 中)或包含正则表达式元字符,或者 PARM2 的第二个字段包含
&或其他反向引用,则执行我认为您想要的字符串会更难。因此,如果任何一种情况都可能发生,那么不要仅仅发布一个微不足道的晴天案例,其中一切都是唯一的、不相关的字母数字字符串,edit 你的问题是提供一个示例,该示例将是对潜在解决方案的真实测试.