Unix 按前缀对行分组
我有一个文件,里面有我用于i18n的键和值。该文件如下所示: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
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