我有数千个日志(.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
但是,这意味着在每个时间段都读取了所有文件,这对我来说似乎效率很低。有没有办法只读取一次每个文件,并将每一行追加到对应于其时间段的文件中?
答案 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中工作。