首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >合并新旧配置txt文件

合并新旧配置txt文件
EN

Stack Overflow用户
提问于 2017-02-13 17:07:23
回答 2查看 50关注 0票数 1

如何使用旧版本中不存在的行更新配置文件?

示例:

config.cfg:

代码语言:javascript
运行
复制
parameterA=0
parameterB=1
parameterC=0

config.cfg.sample:

代码语言:javascript
运行
复制
parameterA=0
parameterB=0
parameterC=0
parameterD=0

我想要做的是使用config.cfg.sample文件执行更新config.cfg文件的命令,并获取以下结果:

代码语言:javascript
运行
复制
parameterA=0
parameterB=1
parameterC=0
parameterD=0

新行并不总是在末尾。不能更改现有行。

例如:

代码语言:javascript
运行
复制
update_config.sh config.cfg config.cfg.sample

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-13 18:03:13

这个连接不需要任何循环。有一个用于此目的的工具,称为join。此命令将为您带来所需的结果。

代码语言:javascript
运行
复制
join -a1 -a2 -t= b.txt bb.txt |cut -d= -f1-2

如果去掉末尾的剪裁,你将能够看到两个文件之间的“比较”。

测试:

代码语言:javascript
运行
复制
$ cat b.txt
parameterA=0
parameterB=1
parameterC=0

$ cat bb.txt
parameterA=0
parameterB=0
parameterC=0
parameterD=0

$ join -a1 -a2 -t= b.txt bb.txt |cut -d= -f1-2
parameterA=0
parameterB=1
parameterC=0
parameterD=0
票数 1
EN

Stack Overflow用户

发布于 2017-02-13 17:25:50

这应该可以完成工作。"config.cfg“是原始文件,而"config.new”是要从中获取新关键字的文件。

代码语言:javascript
运行
复制
#!/bin/sh

exec 0<config.new
while read line; do
  parname=$(echo "$line" |cut -d= -f1)
  # echo "  (debug) new parname=$parname"
  grep "^$parname" config.cfg || echo $line >> config.cfg
done

基本原理是:逐行读取config.new;提取参数名称(通过cut),确定此参数名称是否包含在原始文件中,如果不包含,则将其附加到文件中。

不过,新参数将始终附加到原始文件中。如果需要的话,通过sort传递最终的文件可能会有所帮助。

附注:也许甚至可以避免使用cut命令,因为shell可以执行这种字段提取。我选择让事情变得简单。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42200277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档