Angenommen, das Datumsfeld hat das dd/mm/yy
folgende Format, sollte den Trick ausführen:
cat file1 file2 ... | \ sort -t$'\t' -n -k1,1 -k4.7r -k4.4r -k4.1r | sort -t$'\t' -k1,1n -u
Ich habe ein paar tabulatorgetrennte Dateien.
Jede Datei ist wie folgt aufgebaut:
ID Title Rating Date_Rated
Was ich tun möchte, ist, alle diese Dateien in einer zusammenzuführen und nur die letzte Bewertung beizubehalten.
Datei1 kann Daten enthalten wie:
70202148 Sherlock Holmes: A Game of Shadows 5 28/12/13
file2 kann Daten enthalten wie:
70202148 Sherlock Holmes: A Game of Shadows 4.5 25/12/13
Angenommen, das Datumsfeld hat das dd/mm/yy
folgende Format, sollte den Trick ausführen:
cat file1 file2 ... | \ sort -t$'\t' -n -k1,1 -k4.7r -k4.4r -k4.1r | sort -t$'\t' -k1,1n -u
Die Verwendung von Shell-Tools für diese Aufgabe wäre gefährlich, da sort
Datumsformate nicht verstanden werden können. Ein Beispiel ist, dass, wenn Sie den Code von Miroslav in der folgenden Datei ausführen, die Ausgabe die Zeile mit 28/02/14
falschem Datumsausdruck druckt .
$ 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
Anstatt Shell-Tools zu verwenden, müssen wir hierfür hoch entwickelte Skript- / Programmiersprachen verwenden. Sie können dafür Python, Perl, Ruby oder jede andere Sprache verwenden. Unten ist ein Python
Skript, das die Arbeit erledigt.
#!/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')))
Ausgabe:
$ ./filter.py 70080038 Iron Man 4 18/02/14 70202148 Sherlock Holmes: A Game of Shadows 5 28/12/14