如何在shell中的每个组之后使用换行符按名称对列表进行分组?

时间:2015-07-27 11:08:52

标签: shell newline

我有一个列表,我想按名称分组。这应该在每个组之后使用换行符完成。 这是一个示例文件:

$ cat file
2015-07-09 07:03:46    7.5 GiB apple-foo.txt.gpg
2015-07-22 11:36:36    6.9 GiB apple-bar.txt.gpg
2015-07-27 04:40:34   31.0 GiB banana-here.txt.gpg
2015-07-07 20:28:17   30.6 GiB banana-even.txt.gpg
2015-07-19 15:02:20   30.8 GiB banana-more.txt.gpg
2015-07-26 00:05:11    1.9 GiB coconut-something.txt.gpg
2015-07-23 03:34:41    2.1 GiB coconut-else.txt.gpg
2015-07-24 03:34:40   12.1 GiB date-yougetit.txt.gpg

这是我想要的输出:

2015-07-09 07:03:46    7.5 GiB apple-foo.txt.gpg
2015-07-22 11:36:36    6.9 GiB apple-bar.txt.gpg

2015-07-27 04:40:34   31.0 GiB banana-here.txt.gpg
2015-07-07 20:28:17   30.6 GiB banana-even.txt.gpg
2015-07-19 15:02:20   30.8 GiB banana-more.txt.gpg

2015-07-26 00:05:11    1.9 GiB coconut-something.txt.gpg
2015-07-23 03:34:41    2.1 GiB coconut-else.txt.gpg

2015-07-24 03:34:40   12.1 GiB date-yougetit.txt.gpg

我设法提取唯一的名称(苹果,香蕉,椰子,日期),但是在最后一次出现每个唯一名称后,我没有添加新行。 有人能帮帮我吗? awk和sed是最受欢迎的。

1 个答案:

答案 0 :(得分:1)

awk解决方案:

awk -F\- 'NR>1&&$1!=last{print ""}{last=$1}1' infile

解释

-F\-:将字段分隔符设置为

NR>1:省略检查的第一行。

last=$1:始终保存最后一次出现的组密钥

1:打印当前行。

1!=last{print ""}:如果 $1 NOT 等于last,则打印分隔符。

<强>更新

对于当前来源使用:

awk 'split($NF,a,"-"){current=a[1]}NR>1&&current!=last{print ""}{last=current}1' infile

解释2

split($NF,a,"-"){current=a[1]:要通过在a[1]字符处将其拆分,从行$NF的最后一个字段中获取密钥-