разбить файл на файлы периода времени на основе отметки времени Unix - PullRequest
1 голос
/ 30 апреля 2019

У меня есть несколько тысяч файлов журнала (.txt) (их имена или порядок не имеют значения, равно как и порядок записей в конечных выходных файлах), которые состоят из метки времени Unix и значения, такого как:

infile1.txt:
1361775157 a
1361775315 b            
1379007707 c
1379014884 d

infile2.txt:
1360483293 e
1361384920 f
1372948120 g
1373201928 h

Моя цель - разделить их на произвольно заданные интервалы времени (например, в данном случае с 1360000000, 1370000000 и 1380000000 в качестве границ), чтобы я получил столько файлов, сколько интервалов:

1360000000-1370000000.txt:
1361775157 a 
1361775315 b    
1360483293 e
1361384920 f        

1370000000-1380000000.txt:
1379007707 c
1379014884 d
1372948120 g
1373201928 h

Мой текущий подход заключается в запуске сценария, который фильтрует записи каждого периода в цикле для каждого периода времени (начало и конец в качестве первого и второго аргумента) и добавляет их в файл:

#!/bin/bash

for i in *txt; do
    awk -v t1=$1 -v t2=$2 '$1 >= t1 && $1 < t2' $i >> "elsewhere/$1-$2.txt"
done

Однако это означает, что за каждый период времени все файлы читаются, что мне кажется неэффективным. Есть ли способ прочитать каждый файл только один раз и добавить каждую строку в файл, соответствующий его периоду времени?

1 Ответ

5 голосов
/ 30 апреля 2019

Я бы использовал такой подход:

$ cat tst.awk
{
    bucket = int($1/inc)
    print $0 " > " ( (inc*bucket) "-" (inc*(bucket+1)-1) ".txt" )
}

$ awk -v inc='10000000' -f tst.awk file1 file2
1361775157 a > 1360000000-1369999999.txt
1361775315 b > 1360000000-1369999999.txt
1379007707 c > 1370000000-1379999999.txt
1379014884 d > 1370000000-1379999999.txt
1360483293 e > 1360000000-1369999999.txt
1361384920 f > 1360000000-1369999999.txt
1372948120 g > 1370000000-1379999999.txt
1373201928 h > 1370000000-1379999999.txt

Если вы используете GNU awk (который обрабатывает закрытие / повторное открытие файлов для вас при необходимости), тогда просто измените $0 " > " на >когда закончите тестирование, иначе сделайте это:

{
    bucket = int($1/inc)
    if ( bucket != prev ) {
        close(out)
        out = (inc*bucket) "-" (inc*(bucket+1)-1) ".txt"
        prev = bucket
    }
    print >> out
}

для работы в любом awk.

...