Nach ID sortieren, dann nach Datum sortieren und dann Zeilen mit älterem Datum entfernen?

588
quickbooks

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 
0
Vermutlich sollte ich darauf hinweisen, dass ich 'cat file1 file2> join' tun kann, um die Dateien zusammenzuführen; dann kann ich 'sort join -k1 -n' tun, um es in der ID-Spalte zu sortieren. aber ich habe nicht herausgefunden, wie ich den Rest erledigen soll. quickbooks vor 9 Jahren 0
Sind die Datumsangaben immer in der Form "tt / mm / jj" oder könnten einige von ihnen "tt / m / jj", "d / mm / jj" oder "d / m / jj" sein? G-Man vor 9 Jahren 0

2 Antworten auf die Frage

1
Miroslav Koškár

Angenommen, das Datumsfeld hat das dd/mm/yyfolgende 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 
0
Kannan Mohan

Die Verwendung von Shell-Tools für diese Aufgabe wäre gefährlich, da sortDatumsformate 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/14falschem 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 PythonSkript, 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 
Ich stimme zu, dass die Verwendung von Python generell die bessere Wahl ist, da es flexibler ist. Ich bin mir jedoch nicht sicher, ob Sie bemerkt haben, dass Felder durch Tabulatoren getrennt sind. Wenn Sie dies berücksichtigen, werden Sie sehen, dass "sort" mit einigen Einschränkungen gut funktioniert (z. B. festes Datumsformat). Auch die Möglichkeit, mehrere Zeilen mit denselben Datumsangaben zu haben, ist unwichtig (möglicherweise ist sort sort stabil.) Ansatz). Miroslav Koškár vor 9 Jahren 0