我有几个制表符分隔的文件。
每个文件的结构如下:
ID Title Rating Date_Rated
我想要做的是将所有这些文件合并为一个,并只保留最新的评级。
file1 可能包含如下数据:
70202148 Sherlock Holmes: A Game of Shadows 5 28/12/13
file2 可能包含如下数据:
70202148 Sherlock Holmes: A Game of Shadows 4.5 25/12/13
答案1
假设日期字段采用dd/mm/yy
以下格式即可解决问题:
cat file1 file2 ... | \
sort -t$'\t' -n -k1,1 -k4.7r -k4.4r -k4.1r | sort -t$'\t' -k1,1n -u
答案2
使用 shell 工具执行此任务会很危险,因为sort
无法理解日期格式。例如,如果您在下面的文件中运行 Miroslav 的代码,输出将打印包含日期记录的行,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
我们需要使用高级脚本/编程语言来实现这一点,而不是使用 shell 工具。您可以使用 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