我有一个巨大的数据源,我正在使用一些grep
s 进行过滤。
这基本上是我现在正在做的事情:
#!/bin/bash
param1='something'
param2='another'
param3='yep'
echo $(avro-read /log/huge_data | grep $param1 | grep "$param2-" | grep $param3 | wc -l) / $(avro-read /log/ap/huge_data | grep $param1 | grep -v "$param2-" | grep $param3 | wc -l) | bc -l
Run Code Online (Sandbox Code Playgroud)
请注意我是如何进行两次基本相同的过滤(第二次只有一个差异),对每个进行计数,然后除以最终结果。这绝对是一件很麻烦的事情,但我想尝试加快一点速度,并且只执行一次初始过滤而不使用临时文件。
我尝试使用 fifo,但我不确定是否有可能在一个脚本中读取两个进程,以及是否有第三个进程“等待”,直到两个进程都完成以计算最终结果。我也研究过 using tee
,但又不确定如何同步生成的子进程。
编辑:自己使用https://superuser.com/a/561248/43649解决了这个问题,但将另一个建议标记为答案。
如果您只是想避免创建临时文件(或将 grep 的输出存储在变量中),您可以将其提供给 for 循环,如下所示:
#!/bin/bash
IFS=$'\n'
yay=0
nay=0
for line in `avro-read /log/huge_data | grep $param1 | grep $param3`; do
[[ $line =~ $param2- ]] && yay=$(($yay + 1)) || nay=$(($nay + 1))
done
echo $yay / $nay \* 100 | bc -l
unset IFS
Run Code Online (Sandbox Code Playgroud)
我在您的自我回答中创建了该方法的修改版本,不需要临时文件:
#!/bin/bash
(avro-read /log/huge_data | grep $param1 | grep $param3 | tee \
>(echo yay=`grep -c "$param2-"`) \
>(echo nay=`grep -vc "$param2-"`) \
>/dev/null | cat ; echo 'echo $yay / $nay \* 100 | bc -l') | sh
Run Code Online (Sandbox Code Playgroud)
各个命令的输出grep -c
和echo
命令打印为
yay=123
nay=456
echo $yay / $nay \* 100 | bc -l
Run Code Online (Sandbox Code Playgroud)
避免竞争条件1.通过管道sh
执行打印的命令。
1无论哪个grep -c
命令先完成,都将打印第一行输出。
归档时间: |
|
查看次数: |
553 次 |
最近记录: |