Unix 按前缀对行分组

Unix 按前缀对行分组,unix,awk,sed,Unix,Awk,Sed,我有一个文件,里面有我用于i18n的键和值。该文件如下所示: foo.foo=一些字符串 foo.bar=某个字符串 bar.foo=某个字符串 bar.bar=一些字符串 foo=一些字符串 baz.bar=一些字符串 使用某些unix工具(如awk或sed),如何过滤文件,以便将以相同前缀开头(直到第一个点)的行分组在一起,并用空行分隔组 输出应该如下所示 foo.foo=一些字符串 foo.bar=某个字符串 bar.foo=某个字符串 bar.bar=一些字符串 foo=一些字符串 b

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

foo.foo=一些字符串
foo.bar=某个字符串
bar.foo=某个字符串
bar.bar=一些字符串
foo=一些字符串
baz.bar=一些字符串
使用某些unix工具(如awk或sed),如何过滤文件,以便将以相同前缀开头(直到第一个点)的行分组在一起,并用空行分隔组

输出应该如下所示

foo.foo=一些字符串
foo.bar=某个字符串
bar.foo=某个字符串
bar.bar=一些字符串
foo=一些字符串
baz.bar=一些字符串
这应该可以:

awk -F. '$1!=a && NR>1 {print ""} 1; {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
设置为字段分隔符。将
第一个字段
复制到变量
a
。每当一行包含
第一个字段的新值时(即
a!=$1
),打印一条
新行

输出:

AMD$ awk -F. 'a!=$1{print '\n';a=$1}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

虽然这不完全符合您的规范(
awk
sed
,由
分隔),但它适用于您的示例:

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

uniq --group -w 3 file

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

输入中的行是否已经分组在一起?@TomFenech如果我首先通过管道将文件排序为
将是这样。这将打印一个不需要的前导空行,并且您不能在单引号分隔的脚本中使用单引号,因此我甚至不知道该脚本是如何使用的执行时没有语法错误。
uniq --group -w 3 file