源多个文件并输出一个文件

源多个文件并输出一个文件

我有一个文件名“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,lastname根据您所需的输出顺序进行适当排序。但是,当标签以其他方式命名时,此模式将起作用:

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 的手册页。这会将变量设置为指定值,除非它们已经设置且非空。无论您获取文件的顺序如何,至少对于您显示的示例数据来说并不重要。

相关内容