我有一个示例 shell 命令来计算数组百分位数
$ time zcat input.txt.gz | head -n 999999 | awk 'BEGIN{FS="\t"}{print $13}' | st
--percentile=97.5
75
real 0m3.532s
user 0m8.584s
sys 0m0.648s
你可以注意到它很快,因为我想用两个百分位数计算数字,我使用 tee 将 stdout 重定向到命令
mkfifo output_txt;
zcat input.txt.gz | head -n 999999 |
awk 'BEGIN{FS="\t"}{print $13}' |
tee >(st --percentile=2.5) >> output_txt |
st --percentile=97.5 >> output_txt;
cat output_txt; rm output_txt
但这不是任何出局和卡住
我想我可能需要使用fifo,所以我改为
echo "" > output_txt;
zcat input.txt.gz | head -n 999999 |
awk 'BEGIN{FS="\t"}{print $13}' |
tee >(st --percentile=2.5) >> output_txt |
st --percentile=97.5 >> output_txt;
cat output_txt; rm output_txt
它可以运行,但输出一长串数字,看起来该程序正在计算每行的分位数
input.txt
可以生成
for ((i=0; i<999999; i++)); do
number=$(awk 'BEGIN{print int(rand()*1000)/10}')
echo $number >> input.txt
done
=====更新======
正如@ilkkachu 评论,以下命令可以很好地工作
echo "" > output_txt;
zcat input.txt | head -n 999999 |
awk 'BEGIN{FS="\t"}{print $13}' |
tee >(st --percentile=2.5 >> output_txt) |
st --percentile=97.5 >> output_txt;
cat output_txt; rm output_txt
但使用fifo时不起作用(仍然卡住)
更新:@Paul_Pedant
FIFO 是一个管道。当它获取的数据达到某个系统限制(可能是 4096 字节(POSIX 最小值)或 64KB(典型 Linux)或其他限制)时,fifo 会阻塞写入,直到其他进程读取一些数据。
我认为这可以解释为什么在使用 fifo 时卡住