在每个部分的 header 中按 (DOW MON DD YY) 日期对分成多个部分的文件进行排序

Sort a file broken into sections by (DOW MON DD YY) date in each section's header

我有一个包含重复条目的文件。条目条目以日期开头,一个空行将这两个条目分隔开。如何使用排序命令或 uniq 命令对日期进行排序:

* Mon Jan 29 2001 Bernhard Rosenkraenzer <bero@mail.com>
- Some fixes to init scripts

* Wed Jan 17 2001 Bernhard Rosenkraenzer <bero@mail.com>
- Add missing man pages, fix up init script (Bug #17676)
- Can be patched in for future release.


* Thu Feb 1 2001 Trond Eivind Glomsrød <teg@mail.com>
- Fix check for ipchains

我使用了这样的排序命令:

sort -n -t" " -k5 -k3M -k4

但它没有捕获日期之后的行,我需要对日期+内容进行排序。

根据@jchevali 的评论 - 只需要找到一个 awk 和 tr 都可以正常处理但不在要处理的文本中的可打印字符:

awk '/^*/{printf "%s ^",[=10=]} /^-/{printf "%s ^",[=10=]} /^[ \t]*$/{printf "\n"}' paras | sort -n -t" " -k5 -k3M -k4  | tr '^' '\n'

* Wed Jan 17 2001 Bernhard Rosenkraenzer <bero@mail.com> 
- Add missing man pages, fix up init script (Bug #17676) 
- Can be patched in for future release. 

* Mon Jan 29 2001 Bernhard Rosenkraenzer <bero@mail.com> 
- Some fixes to init scripts 

* Thu Feb 1 2001 Trond Eivind Glomsrød <teg@mail.com> 
- Fix check for ipchains

使用 Perl 也可以,

> cat paras.txt
* Mon Jan 29 2001 Bernhard Rosenkraenzer <bero@mail.com>
- Some fixes to init scripts

* Wed Jan 17 2001 Bernhard Rosenkraenzer <bero@mail.com>
- Add missing man pages, fix up init script (Bug #17676)
- Can be patched in for future release.


* Thu Feb 1 2001 Trond Eivind Glomsrød <teg@mail.com>
- Fix check for ipchains
> perl -lne ' $_=/^\*/?$_:/^-/?"!$_":"\n"; printf("%s",$_);END{print} ' paras.txt | sort -n -t" " -k5 -k3M -k4  | tr '!' '\n' | sed 's/^\*/\n*/g'


* Wed Jan 17 2001 Bernhard Rosenkraenzer <bero@mail.com>
- Add missing man pages, fix up init script (Bug #17676)
- Can be patched in for future release.

* Mon Jan 29 2001 Bernhard Rosenkraenzer <bero@mail.com>
- Some fixes to init scripts

* Thu Feb 1 2001 Trond Eivind Glomsrød <teg@mail.com>
- Fix check for ipchains
>

Input(如问题中所述,有一些双空行):

cat input
* Mon Jan 29 2001 Bernhard Rosenkraenzer <bero@mail.com>
- Some fixes to init scripts

* Wed Jan 17 2001 Bernhard Rosenkraenzer <bero@mail.com>
- Add missing man pages, fix up init script (Bug #17676)
- Can be patched in for future release.


* Thu Feb 1 2001 Trond Eivind Glomsrød <teg@mail.com>
- Fix check for ipchains

命令:

cat -s input | awk '!/^$/{printf [=11=];next}{print}' | sort -n -t" " -k5 -k3M -k4 | sed 's/- /\n- /g;s/$/\n/'

输出:

cat -s input | awk '!/^$/{printf [=12=];next}{print}' | sort -n -t" " -k5 -k3M -k4 | sed 's/- /\n- /g;s/$/\n/'
* Wed Jan 17 2001 Bernhard Rosenkraenzer <bero@mail.com>
- Add missing man pages, fix up init script (Bug #17676)
- Can be patched in for future release.

* Mon Jan 29 2001 Bernhard Rosenkraenzer <bero@mail.com>
- Some fixes to init scripts

* Thu Feb 1 2001 Trond Eivind Glomsrød <teg@mail.com>
- Fix check for ipchains

(注意空双线已经去掉)

说明:

  • cat -s input 将删除连续的空行(如果您的输入文件中没有空行,您可以删除这部分命令)
  • awk '!/^$/{printf [=14=];next}{print}' 将折叠行而不添加额外的字符,当行不为空时,只需打印不带 \n 的行,当它为空时,它只会添加一个 EOL字符
  • sort -n -t" " -k5 -k3M -k4你的排序操作
  • sed 's/- /\n- /g;s/$/\n/' 通过在以 - 开头的模式前添加 \n 并在每行的末尾重新创建空行。