如何用awk或sed将文件中连续匹配项替换为另一文件对应内容?
用awk实现按顺序替换匹配内容
核心思路
先将File2.txt中的所有数字读取到数组中,再遍历File1.txt,每遇到匹配XXX family的行,就依次取出数组中的对应元素完成替换,其余行保持原样输出。
实现命令
创建名为replace.awk的脚本文件,内容如下:
NR==FNR { nums[++n] = $0; next } $2 == "family" && $1 == "XXX" { $1 = nums[++cnt]; print; next } 1
执行命令生成目标文件:
awk -f replace.awk File2.txt File1.txt > New_file.txt
命令解释
NR==FNR { nums[++n] = $0; next }:处理第一个输入文件(File2.txt)时,将每一行内容存入数组nums,NR为全局行号,FNR为当前文件行号,两者相等时判定为正在处理第一个文件。$2 == "family" && $1 == "XXX" { $1 = nums[++cnt]; print; next }:处理第二个输入文件(File1.txt)时,匹配第一列为XXX、第二列为family的行,将第一列替换为nums数组的下一个元素,打印该行后跳过后续逻辑。1:默认打印所有未被特殊处理的行,保证原文件其他内容不变。
最终结果
生成的New_file.txt内容如下:
123 zone 123 patch 123 family 456 zone 456 patch 456 family 789 zone 789 patch 789 family
补充:sed的实现方式(需配合辅助工具)
sed本身不支持直接跨文件按顺序读取替换内容,需借助shell循环实现,示例如下:
paste <(grep -n "XXX family" File1.txt | cut -d: -f1) File2.txt | while read line num; do sed -i "${line}s/XXX/${num}/" File1.txt done
注意:该方式会直接修改原File1.txt,大文件场景下效率低于awk,建议操作前备份原文件。
内容的提问来源于stack exchange,提问作者jsceco
相关产品推荐
相关产品推荐

