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

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

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

$ 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&&!=last{print ""}{last=}1' infile

解释

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

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

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

1:打印当前行。

1!=last{print ""}:如果 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的最后一个字段中获取密钥-

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复