我有一个文件名“conf1”,其中包含以下变量:
name='john'
last=''
custom='1000'
另一个文件名为conf2,如下所示:
name='john'
last='star'
我想将它们合并到一个文件中,但合并的文件以与我获取它们相同的顺序包含变量。
例如,如果我先获取conf1,然后获取conf2,那么conf 2中的变量将覆盖conf1。但我也会有conf2 中没有的变量。
我想合并并创建 1 个文件,其中仅包含唯一且最后是源的变量。
所需输出:conf3
name='john'
last='star'
custom='1000'
这可能吗?
答案1
你可以这样做:
$ awk -F= '{l[$1]=$0};END{for (i in l) print l[i]}' conf1 conf2
custom='1000'
last='star'
name='john'
请注意,输出中行的顺序无法保证(基于如何awk
在哈希表中内部存储数组),但 中的设置conf2
将覆盖 中的设置conf1
。
在哪里
awk -F= ... conf1 conf2
=
在conf 文件上调用 awk作为分隔符。{l[$1]=$0}
存储每个变量的定义,最新的覆盖最旧的END{ ... }
最后,(处理完所有文件后)for (i in l)
循环所有变量,print l[i]
并打印它。
答案2
Perl 方法:
$ perl -F= -lane '$k{$F[0]}=$F[1]; END{print "$_=$k{$_}" for keys(%k)}' conf1 conf2
last='star'
name='john'
custom='1000'
这与 Stéphane 的回答是一样的。它构建一个哈希,其中变量名称是键,其值是值。然后,处理完所有文件后,它会打印出键/值对。请注意,行的顺序不受保证,并且可以在调用之间更改,但 的值conf2
将始终覆盖 的值conf1
。
答案3
为了conf2
获得优先权,它必须位于conf1
参数之前sort
。
sort -suk1,1 -t= conf2 conf1 | tac
输出:
name='john'
last='star'
custom='1000'
上面的内容确实依赖于 labels custom
,last
并name
根据您所需的输出顺序进行适当排序。但是,当标签以其他方式命名时,此模式将起作用:
eval srx=\" 's/^'{name/1,last/2,custom/3}'=&/;' \" # sort seq: 1,2,3,etc
sort -suk1,1 -t= conf2 conf1 | sed "$srx" | sort -n | cut -d= -f2-
答案4
用这个:
name=${name:-John}
last=${last:-}
custom=${custom:-1000}
...在其他文件中也是如此。阅读 shell 的手册页。这会将变量设置为指定值,除非它们已经设置且非空。无论您获取文件的顺序如何,至少对于您显示的示例数据来说并不重要。