在每个部分的 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
并在每行的末尾重新创建空行。
我有一个包含重复条目的文件。条目条目以日期开头,一个空行将这两个条目分隔开。如何使用排序命令或 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
并在每行的末尾重新创建空行。