Skip to main content
 首页 » 编程设计

awk之按 block 名称合并两个 ini 文件

2025年05月04日35arxive

如何合并两个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 中,该数组按递增数字索引以按顺序打印数据
  • 在 END block 中,我们遍历 seq 数组并打印每个标题和详细信息 block 。如果我们有更多数据要处理,我们会附加一个换行符。