Linux 在每个节中按(DOW MON-DD-YY)日期对文件进行分段排序';s头

Linux 在每个节中按(DOW MON-DD-YY)日期对文件进行分段排序';s头,linux,sorting,uniq,Linux,Sorting,Uniq,我有一个文件有重复的条目。条目以日期开始,两个条目之间有一个空行。如何使用sort命令或uniq-comand对日期进行排序: * 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 u

我有一个文件有重复的条目。条目以日期开始,两个条目之间有一个空行。如何使用sort命令或uniq-comand对日期进行排序:

* 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

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

基于@jchevali的注释-只需要找到一个awk和tr都可以优雅处理的可打印字符,而该字符不在待处理的文本中:

awk '/^*/{printf "%s ^",$0} /^-/{printf "%s ^",$0} /^[ \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
awk'/^*/{printf”%s^“,$0}/^-/{printf”%s^“,$0}/^[\t]*$/{printf”\n}段| sort-n-t”“-k5-k3M-k4 | tr'^'\n
*2001年1月17日星期三Bernhard Rosenkraenzer
-添加缺少的手册页,修复初始化脚本(Bug#17676)
-可以在以后的版本中进行修补。
*2001年1月29日星期一Bernhard Rosenkraenzer
-对init脚本的一些修复
*2001年2月1日(星期四)
-修复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
>
>cat parats.txt
*2001年1月29日星期一Bernhard Rosenkraenzer
-对init脚本的一些修复
*2001年1月17日星期三Bernhard Rosenkraenzer
-添加缺少的手册页,修复初始化脚本(Bug#17676)
-可以在以后的版本中进行修补。
*2001年2月1日(星期四)
-修复ipchains的检查
>perl-lne'$\u=/^\*/?$\ u:/^-/?“!$”:“\ n”;printf(“%s”,美元);结束{print}'paras.txt | sort-n-t”“-k5-k3M-k4 | tr'!”\n'| sed's/^\*/\n*/g'
*2001年1月17日星期三Bernhard Rosenkraenzer
-添加缺少的手册页,修复初始化脚本(Bug#17676)
-可以在以后的版本中进行修补。
*2001年1月29日星期一Bernhard Rosenkraenzer
-对init脚本的一些修复
*2001年2月1日(星期四)
-修复ipchains的检查
>
输入(如问题中所述,有一些双空行):

输出:

cat -s input | awk '!/^$/{printf $0;next}{print}' | sort -n -t" " -k5 -k3M -k4 | sed 's/- /\n- /g;s/$/\n/'
cat -s input | awk '!/^$/{printf $0;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输入| awk'/^$/{printf$0;next}{print}'sort-n-t'-k5-k3M-k4 | sed's/-/\n-/g;s/$/\n/'
*2001年1月17日星期三Bernhard Rosenkraenzer
-添加缺少的手册页,修复初始化脚本(Bug#17676)
-可以在以后的版本中进行修补。
*2001年1月29日星期一Bernhard Rosenkraenzer
-对init脚本的一些修复
*2001年2月1日(星期四)
-修复ipchains的检查
(请注意,已删除空的双线)

解释:

cat -s input | awk '!/^$/{printf $0;next}{print}' | sort -n -t" " -k5 -k3M -k4 | sed 's/- /\n- /g;s/$/\n/'
cat -s input | awk '!/^$/{printf $0;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$0;next}{print}'
    将折叠行而不添加额外字符,只需在不打印
    \n
    的情况下打印行,当行不为空且为空时,仅添加
    EOL
    字符
  • sort-n-t”“-k5-k3M-k4
    您的排序操作
  • sed的/-/\n-/g;s/$/\n/'
    通过在以
    -
    开头的模式之前添加
    \n
    ,并在每行末尾添加
    \n
    以重新创建空行,将行与
    之前的行分开

我认为解决方案可以通过将任何不以*开头的行之前的\n转换为另一个字符,例如\t(如果您的文本不包含制表符),然后使用如上所述的排序,该排序将在其制表符文本内容之后的日期进行排序(因为这将成为一个长行中的一个组),最后,在排序之后,将制表符重新换行。使用简单的命令无法轻松完成此任务,需要进行一些编程。Awk应该足够了,如果您更熟悉python或perl,请使用它们。。。。首先是段落格式(然后是日期字段的位置和格式。您似乎在尝试对
.spec
文件中的更改日志条目进行排序?David…您是对的。当您显然真的愿意接受使用其他工具的答案时,为什么问题指定您需要使用
排序
uniq
的答案(perl、awk等)?如果你没有令人信服的限制理由,如果你不考虑它,你会得到范围更广的答案。很好的技巧。你做得比我自己好。不知道你可以使用sort来按月排序缩写(
-M
).Neat.Thank Tink它可以工作。你能建议如果它是一种反向排序,如何实现它吗?遗憾的是,我在问题中没有提到。sort-r不起作用。只需将排序更改为如下
sort-t”“-k5nr-k3Mr-k4nr
。@ParasPandey