Nach ID sortieren, dann nach Datum sortieren und dann Zeilen entfernen, die das ältere Datum haben?


0

Ich habe ein paar tabulatorgetrennte Dateien.

Jede Datei ist folgendermaßen aufgebaut:

ID          Title                                 Rating    Date_Rated

Was ich tun möchte, ist, alle diese Dateien in einer zusammenzuführen und nur die neueste Bewertung beizubehalten.

file1 kann folgende Daten enthalten:

70202148    Sherlock Holmes: A Game of Shadows    5         28/12/13

file2 kann folgende Daten enthalten:

70202148    Sherlock Holmes: A Game of Shadows    4.5       25/12/13

Sollte wohl darauf hinweisen, dass ich 'cat file1 file2 & gt; verbunden ', um die Dateien zusammenzuführen; dann kann ich 'sort join -k1 -n' ausführen, um es in der ID-Spalte zu sortieren; aber ich habe nicht herausgefunden, wie ich den Rest erledige.
quickbooks

Sind die Daten immer in der Form dd/mm/yy, oder könnten einige von ihnen sein dd/m/yy, d/mm/yy, oder d/m/yy?
G-Man

Antworten:


1

Angenommen, das Datumsfeld ist in dd/mm/yy Das folgende Format sollte den Trick machen:

cat file1 file2 ... | \
    sort -t$'\t' -n -k1,1 -k4.7r -k4.4r -k4.1r | sort -t$'\t' -k1,1n -u

0

Die Verwendung von Shell-Tools für diese Aufgabe wäre gefährlich wie sort wird nicht in der Lage sein, Datumsformate zu verstehen. Ein Beispiel ist, dass, wenn Sie Miroslavs Code in der folgenden Datei ausführen, die Ausgabe die Zeile mit Datumsaufzeichnung druckt 28/02/14 was falsch ist.

$ 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 dafür übergeordnete Skript- / Programmiersprachen verwenden. Sie können dafür Python, Perl, Ruby oder eine andere Sprache verwenden. Unten ist ein Python Skript, das den Job macht.

#!/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 bin damit einverstanden, dass die Verwendung von Python im Allgemeinen die bessere Wahl ist, da es flexibler und umfassender ist. Trotzdem bin ich mir nicht sicher, ob Sie bemerkt haben, dass Felder durch Tabulatoren getrennt sind. Wenn Sie das berücksichtigen, sehen Sie oben sort funktioniert problemlos mit einigen Einschränkungen (z. B. festes Datumsformat), außerdem ist die Möglichkeit, mehrere Zeilen mit demselben Datum zu haben, nicht sonderlich wichtig (eine stabile Sortierung kann ein Ansatz sein).
Miroslav Koškár
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.