脚本与命令行中管道的不同输出

时间:2013-10-18 07:54:06

标签: bash awk pipe

我有一个目录,其中包含我想要逐个处理的文件,每个输出都是这样的:

==== S=721 I=47 D=654 N=2964 WER=47.976% (1422)

然后我想通过将输出管道输入到awk来计算平均百分比(第6列)。我宁愿在1个脚本中完成所有操作并编写以下代码:

for f in $dir; do
    echo -ne "$f "
    process $f
done | awk '{print $7}' | awk -F "=" '{sum+=$2}END{print sum/NR}'

当我多次运行时,我经常得到不同的结果,尽管在我看来没有什么真正改变。结果几乎总是不正确的。

但是,如果我只在脚本和管道中将for循环放在命令行上的awk中,结果总是相同且正确。

有什么区别,如何更改脚本以获得正确的结果?

2 个答案:

答案 0 :(得分:1)

稍微猜测一下你要做什么,没有更多的细节,很难说究竟出了什么问题。

for f in $dir; do
    unset TEMPVAR 
    echo -ne "$f "
    TEMPVAR=$(process $f | awk '{print $7}')
    ARRAY+=($TEMPVAR)
done 

我要做的是将所有值附加到for循环中的数组中。现在你所有的百分比都在$ARRAY。使用您喜欢的任何工具计算平均值应该很容易。

这也可以帮助您排除故障。如果数组${#ARRAY[@]}中的元素太少,那么你就会知道你的循环在哪里提前终止。

答案 1 :(得分:0)

# To get the percentage of all files
Percs=$(sed -r 's/.*WER=([[:digit:].]*).*/\1/' *)

# The divisor
Lines=$(wc -l <<< "$Percs")

# To change new liner into spaces
P=$(echo $Percs)

# execute 1 time without the bc. It's easier to understand
echo "scale=3; (${P// /+})/$Lines" | bc