如何用awk或sed实现非结构化文件中指定位置的键值替换?
解决方案
方法一:使用awk实现
awk适合处理这种需要先加载键值对、再匹配替换非结构化文本的场景,具体实现如下:
单行命令
awk 'BEGIN{FS=","} NR==FNR{kv[$1]=$2;next} {for(i=1;i<=NF-2;i++){if($i in kv && $(i+1)=="A"){$(i+2)=kv[$i];break}}}1' File1 File2
脚本形式(可读性更强)
创建replace.awk脚本文件:
# 处理CSV文件时设置分隔符为逗号 BEGIN { FS = "," } # 读取第一个文件(File1),将键值对存储到数组kv中 NR == FNR { kv[$1] = $2 next } # 处理第二个文件(File2) { # 遍历每个字段,查找符合"Key + A"的位置 for (i = 1; i <= NF - 2; i++) { # 当当前字段是已存储的Key,且下一个字段为常量"A"时 if ($i in kv && $(i+1) == "A") { # 替换"A"后面的旧值为对应Value $(i+2) = kv[$i] # 找到第一个匹配项后退出循环,避免同一行多个匹配时重复替换 break } } # 输出修改后的行 print }
执行脚本:
awk -f replace.awk File1 File2
方法二:使用sed实现
通过先将CSV键值对转换为sed替换规则,再批量处理非结构化文本:
sed -f <(awk 'BEGIN{FS=","} {printf "s/\\(%s A \\)[^ ]*/\\1%s/\n", $1, $2}' File1) File2
原理说明
- awk读取File1的键值对,生成sed替换规则:每个规则匹配
Key A 旧值的模式,将旧值替换为对应Value - sed通过
-f选项读取这些规则,批量处理File2的内容
内容的提问来源于stack exchange,提问作者newbie_learn
相关产品推荐
相关产品推荐

