如果使用逗号值不存在,则将内容附加到文件

时间:2016-04-19 15:07:11

标签: bash shell unix

我们有一个名为parameters.txt的文件,其中包含逗号分隔值:

db.hostname,db.username,db.password,db.url,db.status,codesettingsA, codesettimgsB

另外,我们有一个名为properties.txt的主文件,其中包含行格式

db.hostname=hostname
db.username=username
db.password=password

我需要在parameters.txt中传递逗号分隔值,并检查它是否存在于properties.txt中。如果它不存在,它应该打印properties.txt的底部

例如,在properties.txt:db.url中,db.status,codesettingsA和codesettimgsB不存在。但是,我从parameters.txt传递。它应该被追加,结果在properties.txt中应该是这样的:

db.url
db.status
codesettingsA
codesettimgsB

注意:已在属性文件中为db.hostname = hostname,db.username = username和db.password = password声明已有值。我从参数文件传递db,hostname,db.username,db.password。因此,即使在逗号之后也应该忽略这些值,并且不应该打印db,hostname,db.username,db.password

有没有办法在properties.txt的底部打印它们? 你能提供示例代码吗?

3 个答案:

答案 0 :(得分:2)

试试这个:

IFS=',' read -ra params < parameters.txt
for param in "${params[@]}"; do
  grep "$param" properties.txt || echo "$param" >> properties.txt
done

解析参数并将其存储到params数组中。

对于每个参数,循环检查它是否存在于properties.txt中,如果不存在,则将其附加到文件的底部。

答案 1 :(得分:1)

你可以使用这个awk:

awk 'FNR==NR{for (i=1; i<=NF; i++) a[$i]; next} $1 in a{delete a[$1]} 1;
   END{for (i in a) print i "="}' FS=' *, *' params.txt FS=' *= *' props.txt

<强>输出:

db.hostname=hostname
db.username=username
db.password=password
codesettimgsB=
db.url=
codesettingsA=
db.status=

答案 2 :(得分:0)

cat properties.txt <(grep -vf properties.txt <(tr ',' '\n' <parameters.txt))
  

tr ..将csv格式的记录转换为换行符,grep ..找不到参数.txt中的行,cat ..追加它们