Использование инструментов оболочки для этой задачи было бы опасно, так как sort
не сможет понять форматы даты. Например, если вы запустите код Мирослава в приведенном ниже файле, на выходе будет напечатана строка с записью даты 28/02/14
что неверно.
$ cat file.txt
70202148 Sherlock Holmes: A Game of Shadows 5 28/12/14
70202148 Sherlock Holmes: A Game of Shadows 5 28/02/14
70202148 Sherlock Holmes: A Game of Shadows 5 28/12/13
70202148 Sherlock Holmes: A Game of Shadows 5 28/12/13
Вместо того, чтобы использовать инструменты оболочки, для этого нам нужно использовать высокоуровневые языки сценариев / программирования. Для этого вы можете использовать Python, Perl, Ruby или любой другой язык. Ниже приведен скрипт Python
который делает эту работу.
#!/usr/bin/env python3
import datetime
data = {}
for line in open('file.txt'):
line = line.strip().split()
if len(line) == 0:
continue
if line[0] not in data:
date = datetime.datetime.strptime(line.pop(-1), '%d/%m/%y')
data[line.pop(0)] = {'rating':line.pop(-1), 'year':date, 'title': ' '.join(line[1:]) }
else:
date = datetime.datetime.strptime(line.pop(-1), '%d/%m/%y')
if date > data[line[0]]['year']:
data[line.pop(0)] = {'rating':line.pop(-1), 'year':date, 'title': ' '.join(line[1:]) }
for val in sorted(data):
print('{} {} {} {}'.format(val, data[val]['title'], data[val]['rating'], data[val]['year'].strftime('%d/%m/%y')))
Выход:
$ ./filter.py
70080038 Iron Man 4 18/02/14
70202148 Sherlock Holmes: A Game of Shadows 5 28/12/14