按前缀分组行

Group lines by prefix

我有一个包含用于 i18n 的键和值的文件。该文件如下所示:

foo.foo=Some string
foo.bar=Some string
bar.foo=Some string
bar.bar=Some string
baz.foo=Some string
baz.bar=Some string

使用 awk 或 sed 等 unix 工具,如何过滤文件以便将以相同前缀(直到第一个点)开头的行组合在一起,并用空行分隔组?

输出应该类似于

foo.foo=Some string
foo.bar=Some string

bar.foo=Some string
bar.bar=Some string

baz.foo=Some string
baz.bar=Some string

应该这样做:

awk -F. '!=a && NR>1 {print ""} 1; {a=}' file
foo.foo=Some string
foo.bar=Some string

bar.foo=Some string
bar.bar=Some string

baz.foo=Some string
baz.bar=Some string
awk -F. 'a!={print '\n';a=}1' File

设置.作为字段分隔符。将 first field 复制到变量 a。每当一行包含 first field 的新值(即 a!=)时,打印 newline.

输出:

AMD$ awk -F. 'a!={print '\n';a=}1' File

foo.foo=Some string
foo.bar=Some string

bar.foo=Some string
bar.bar=Some string

baz.foo=Some string
baz.bar=Some string

虽然这不完全符合您的规格(awksed,分隔 .),但它适用于您的示例:

您可以使用uniq进行分组。对于您的示例,相应的命令将是

uniq --group -w 3 file

-w/--check-chars=n 对于仅在 n 个字符的前缀上确定相等性至关重要。不幸的是,这不允许 . 之前的可变长度,但对于统一的前缀长度,我发现它比 awk 解决方案更容易理解。