Сортировать файл, разбитый на разделы, по дате (DOW MON DD YY) в заголовке каждого раздела - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть файл с повторяющимися записями. Запись ввода начинается с даты, пустая строка разделяет эти две записи. Как использовать команду сортировки или команду 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

Iиспользовал команду сортировки, например:

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

, но она не захватывает строки после даты, мне нужно отсортировать дату + contentforthatdate.

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

С 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
>
0 голосов
/ 14 декабря 2018

Ввод (как описано в вопросе, есть несколько двойных пустых строк):

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 $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 char
  • sort -n -t" " -k5 -k3M -k4 вашу операцию сортировки
  • sed 's/- /\n- /g;s/$/\n/', чтобы отделитьстрок, как они были до awk, добавив \n перед шаблонами, начинающимися с - и добавив \n в конце каждой строки, чтобы воссоздать пустые строки.
0 голосов
/ 14 декабря 2018

Исходя из комментария @ 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
...