如何合并两个ini文件的两个 block ?
您好,我有两个 ini 文件,它们以 block 的形式存储数据,如下所示:
-->cat f1
[default]
a1=1
b1=2
c1=3
[foo]
d=1
e1=5
-->cat f2
[default]
a2=5
b2=6
[foo]
c2=7
d2=8
e2=9
[bar]
f2=10
我需要按如下方式合并这两个文件:
[default]
a1=1
b1=2
c1=3
a2=5
b2=6
[foo]
d=1
e1=5
c2=7
d2=8
e2=9
[bar]
f2=10
老实说,我不知道从哪里开始,需要什么逻辑或工具。
我试图获得方向的一些愚蠢的事情是:
awk 'NR==FNR{a[$0]=$0;next} $0 in a{print}' f1 f2
[default]
[foo]
awk -vRS='' '{$1=$1}1' f1 f2 |awk '!a[$1]++'
[default] a1=1 b1=2 c1=3
[foo] d=1 e1=5
[bar] f2=10
请您参考如下方法:
使用 awk 你可以这样做:
awk '/^$/{
next
}
/^\[.*\]$/{
hdr = $0
next
}
a[hdr] != "" {
a[hdr] = a[hdr] ORS $0
next
}
{
a[hdr] = $0
seq[++n] = hdr
}
END {
for (i=1; i<=n; i++)
print seq[i] ORS a[seq[i]] (i<n ? ORS : "")
}' f1 f2
[default]
a1=1
b1=2
c1=3
a2=5
b2=6
[foo]
d=1
e1=5
c2=7
d2=8
e2=9
[bar]
f2=10
详细信息:
/^$/匹配我们忽略的所有空行/^\[.*\]$/匹配我们存储在hdr变量中的 header 名称a[hdr] != ""{ ... }当我们已经处理过hdr一次时,我们在数组中追加一个新行和当前行a由hdr 索引
- 否则我们只是将当前行存储在由
hdr索引的数组a中。此外,我们将hdr存储在另一个数组seq中,该数组按递增数字索引以按顺序打印数据 - 在
ENDblock 中,我们遍历seq数组并打印每个标题和详细信息 block 。如果我们有更多数据要处理,我们会附加一个换行符。
