Есть ли более быстрый способ получить самую последнюю строку? - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь получить самую последнюю запись для каждого IP-адреса - второй столбец - используя дату в столбце 3 из data.csv. В настоящее время я использую for l oop с sort & grep, но мой фактический data.csv содержит более 9000 строк, и этот процесс занимает более часа. Я ищу более быстрый метод для анализа этих данных (возможно, AWK?)

data.csv:

110095,10.185.10.53,2020-01-07 03:00:57
110095,10.185.10.53,2019-11-06 09:22:02
110095,10.185.12.15,2019-09-23 09:03:24
110095,10.185.12.15,2019-09-23 09:03:24
110095,10.185.12.16,2020-01-07 03:00:57
110095,10.185.12.16,2019-12-20 09:18:57
110095,10.185.12.31,2019-02-07 08:13:35
110095,10.185.12.31,2019-12-20 09:18:57
110095,10.185.12.31,2020-01-07 03:00:57
110095,10.185.12.32,2019-09-23 09:03:24
110095,10.185.12.32,2019-12-20 09:18:57
110095,10.185.12.32,2019-11-06 09:22:02

Текущий используемый процесс:

UNIQUE=$(awk -F, '{print $2}' "/C/Temp/data.csv" | sort -t, -k2 | uniq)

for dest in $UNIQUE; do
    grep ,${dest}, "/C/Temp/data.csv"  | tr , ' ' | sort -k3 -k4 | tail -1 >> /C/temp/Latest.csv
done

Последний .csv:

110095 10.185.10.53 2020-01-07 03:00:57
110095 10.185.12.15 2019-09-23 09:03:24
110095 10.185.12.16 2020-01-07 03:00:57
110095 10.185.12.31 2020-01-07 03:00:57
110095 10.185.12.32 2019-12-20 09:18:57

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Вы можете сделать один проход в awk для сохранения самой последней записи для каждого IP-адреса:

awk -F, '     
    $3 > times[$2] {
        times[$2] = $3
        $1 = $1            # Self-assign to get rid of input commas
        out[$2] = $0
    }
    END {
        for (ip in out) {
            print out[ip]
        }
    }
' data.csv

Это может изменить последовательность, в которой отображаются IP-адреса.

0 голосов
/ 31 января 2020

Нет простого способа сохранить отсортированный порядок IP-адресов, если записи еще не отсортированы по IP и времени в порядке возрастания или убывания. Однако вы можете сохранить порядок, используя GNU awk для сортировки индексов окончательной записи перед выводом сохраненных значений записи.

Кроме того, если вы используете GNU awk, вы можете создавать временную метку для каждой даты / значения времени (преобразованные в секунды с начала эпохи) и проведите сравнение записей IP на этой основе.

Это можно сделать с помощью следующего:

awk -F, '{ 
        dtspec=$3                   # save date/time values from 3rd field
        gsub(/[-:]/," ",dtspec)     # remove '-' and ':' to create datespec
        tmspec=mktime(dtspec)       # create timespec from datespec w/mktime
        if (tmspec > ip[$2]) {      # compare timespec w/current for IP
            $1 = $1                 # remove field separators
            rec[$2]=$0              # store modified record
            ip[$2]=tmspec           # update timespec for ip
        }
    }
END {
    n = asorti (rec, sorted)        # sort rec by index into sorted
    for (i=1; i<=n; i++)            # loop over sorted indexes
        print rec[sorted[i]]        # outputting records by sorted indexes
}' data.csv

Пример Использование / Вывод

Для тестирования вы можете скопировать / middle-mouse-paste в набор xterm в каталог, содержащий ваш файл.

$ awk -F, '{
>         dtspec=$3                   # save date/time values from 3rd field
>         gsub(/[-:]/," ",dtspec)     # remove '-' and ':' to create datespec
>         tmspec=mktime(dtspec)       # create timespec from datespec w/mktime
>         if (tmspec > ip[$2]) {      # compare timespec w/current for IP
>             $1 = $1                 # remove field separators
>             rec[$2]=$0              # store modified record
>             ip[$2]=tmspec           # update timespec for ip
>         }
>     }
> END {
>     n = asorti (rec, sorted)        # sort rec by index into sorted
>     for (i=1; i<=n; i++)            # loop over sorted indexes
>         print rec[sorted[i]]        # outputting records by sorted indexes
> }' data.csv
110095 10.185.10.53 2020-01-07 03:00:57
110095 10.185.12.15 2019-09-23 09:03:24
110095 10.185.12.16 2020-01-07 03:00:57
110095 10.185.12.31 2020-01-07 03:00:57
110095 10.185.12.32 2019-12-20 09:18:57

Если вам не нужно сохранять отсортированный порядок IP - тогда ответ @ BenjaminW - безусловно, ваша лучшая и самая портативная ставка.

...