按前缀分组行

时间:2015-03-26 11:16:10

标签: unix awk sed

我有一个文件,里面充满了我用于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

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

输出应该看起来像

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

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

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

3 个答案:

答案 0 :(得分:3)

这应该做:

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

答案 1 :(得分:1)

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

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

<强>输出:

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

答案 2 :(得分:0)

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

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

uniq --group -w 3 file

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