根据时间unix戳将文件拆分为时间段文件

时间:2019-04-30 13:42:11

标签: bash unix awk timestamp

我有数千个日志(.txt)文件(它们的名称或顺序无关紧要,最终输出文件中条目的顺序也无关紧要),这些文件由unix时间戳和一个值组成,例如:< / p>

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 个答案:

答案 0 :(得分:5)

我会使用这样的方法:

$ 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中工作。