จัดเรียงตาม ID จากนั้นเรียงลำดับตามวันที่จากนั้นลบบรรทัดที่มีวันที่เก่ากว่าออก


0

ฉันมีไฟล์ที่คั่นด้วยแท็บสองไฟล์

แต่ละไฟล์มีโครงสร้างดังนี้:

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

อาจชี้ให้เห็นว่าฉันสามารถทำ 'cat file1 file2> join' เพื่อรวมไฟล์; จากนั้นฉันสามารถทำ 'sort join -k1 -n' เพื่อเรียงลำดับในคอลัมน์ ID; แต่ฉันไม่ได้คิดวิธีที่จะทำส่วนที่เหลือ
quickbooks

เป็นวันที่มักจะอยู่ในรูปแบบdd/mm/yyหรือบางคนอาจจะมีdd/m/yy, d/mm/yyหรือd/m/yy?
G-Man

คำตอบ:


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

0

การใช้เครื่องมือเชลล์สำหรับงานนี้อาจเป็นอันตรายเนื่องจาก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

แทนที่จะใช้เครื่องมือเชลล์เราต้องใช้ภาษาสคริปต์ / การเขียนโปรแกรมระดับสูงสำหรับสิ่งนี้ คุณสามารถใช้ 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

ฉันเห็นด้วยกับการใช้ Python โดยทั่วไปแล้วเป็นตัวเลือกที่ดีกว่าเนื่องจากมีความยืดหยุ่นมากกว่า อย่างไรก็ตามฉันไม่แน่ใจว่าคุณสังเกตเห็นว่าฟิลด์ถูกคั่นด้วยแท็บ หากคุณคิดว่าคุณจะเห็นด้านบนsortจะทำงานได้ดีกับข้อ จำกัด บางประการ (เช่นรูปแบบวันที่กำหนดตายตัว) แต่ก็ไม่ได้สนใจว่าจะมีหลายแถวที่มีวันที่เหมือนกันหรือไม่
Miroslav Koškár
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.