linux – 合并已排序的文件,具有最小的缓冲
发布时间:2020-12-13 23:19:59 所属栏目:Linux 来源:网络整理
导读:我有两个以可排序的timesetamp为前缀的日志文件. 我希望按顺序看到它们,而生成日志文件的进程仍在运行.这是一个非常忠实的模拟情况: slow() { # print stdout at 30bps exec pv -qL 30}timestamp() { # prefix stdin with a sortable timestamp exec tai64n
我有两个以可排序的timesetamp为前缀的日志文件.
我希望按顺序看到它们,而生成日志文件的进程仍在运行.这是一个非常忠实的模拟情况: slow() { # print stdout at 30bps exec pv -qL 30 } timestamp() { # prefix stdin with a sortable timestamp exec tai64n } # Simulate two slowly-running batch jobs: seq 000 099 | slow | timestamp > seq.1 & seq1=$! seq 100 199 | slow | timestamp > seq.2 & seq2=$! # I'd like to see the combined output of those two logs,in timestamp-sorted order try1() { # this shows me the output as soon as it's available,# but it's badly interleaved and not necessarily in order tail -f seq.1 --pid=$seq1 & tail -f seq.2 --pid=$seq2 & } try2() { # this gives the correct output,# but outputs nothing till both jobs have stopped sort -sm <(tail -f seq.1 --pid=$seq1) <(tail -f seq.2 --pid=$seq2) } try2 wait 解决方法
solution using
tee (写入文件以便标准输出仍然进入控制台)将无法工作,因为tee引入了不必要的延迟并且无法解决问题.同样,我无法使用tail -f -s 0.01(它将轮询改为100 / s)和/或某种类型的调用(如split -filter =’sort -sm’)来解决小批量的问题.
我也没有 tai64n() { perl -MTime::HiRes=time -pe ' printf "@4%015x%x%n",split(/./,time),$c; print 0 x(25-$c) . " "' } 在用sh和bash解决这个问题之后,我运用了标准的故障转移,perl: slow() { # print stdout at 30bps pv -qL 30 } tai64n_and_tee() { # prefix stdin with a sortable timestamp and copy to given file perl -MTime::HiRes=time -e ' $_ = shift; open(TEE,"> $_") or die $!; while (<>) { $_ = sprintf("@4%015x%x%n",$c) . 0 x(25-$c) . " $_"; print TEE $_; print $_; } ' "$1" } # Simulate two slowly-running batch jobs: seq 000 099 | slow | tai64n_and_tee seq.1 & seq 100 199 | slow | tai64n_and_tee seq.2 & wait 这对我来说很方便,因为我已经使用perl作为时间戳.我没有做到这一点,perl充当tai64n和一个单独的perl调用充当tee,但它可能适用于真正的tai64n. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |