我试图创建一个bash脚本来计算文本文件的行和列的平均值和中值。我有平均和中位工作的函数,但是我试图格式化行的输出(列格式很好)。
这就是我想要的:
Averages: Medians:
1 1
5 5
7 7
5 6
3 3
6 6
但是我的代码输出目前是这样做的:
Averages: Medians:
1
5
7
5
3
6
1
5
7
6
3
6
我目前的代码是:
if [[ $1 == -r* ]]
then
echo "Averages: Medians"
avg_nums $INPUT_FILE #calls average function on the file
find_median $INPUT_FILE #calls median function
elif...
#block of code for columns which works correctly.
fi
我老师建议的另一件事我是将平均值和中位数的值存储到临时变量中,然后在我准备好时将它们全部打印在一起。它也没有用。我为此做的是:
#average function
tempAvg+="$avg" #append the new value of average to a global var
.
.
#median function
tempMed+="${arr[$medIndex]}" #append the new value of median to a global var
然后在下面调用
if [[ $1 == -r* ]]
then
echo "Averages: Medians"
printf "%s\t%s\n" "$tempAvg" "$tempMed"
elif...
#block of code for columns which works correctly.
fi
给出输出:
Averages: Medians:
157536 157636
所以很明显我没有尝试过任何工作。我也是新手来编写脚本,只是你知道。有没有人对如何使这个工作有任何建议?我是以错误的方式来做这件事的吗?感谢。
编辑:我的输入文件位于下方(由标签分隔)
1 1 1 1 1
9 3 4 5 5
6 7 8 9 7
3 6 8 9 7
3 4 2 1 4
6 4 4 7 7
答案 0 :(得分:1)
您可以使用paste
paste <(avg_nums ...) <(find_medians ...) | sed '1i\Averages:\tMedians:'
答案 1 :(得分:1)
有很多方法可以解决这个问题。值得庆幸的是,你不是在寻找列总和和中位数,这意味着你不需要在脚本的持续时间内存储所有值,如果我理解正确的话,你可以专注于行平均值和行中位数。
当然,平均值很容易,中位数需要对行进行某种形式的值排序以选择中值。但是,限制为3列,这也是相当容易的。
如果计算并选择每行的平均值和中位数,则可以立即打印该值并完成目标。在阅读和打印每行的结果之前,您需要打印标题。解决此问题的一种方法类似于以下内容:
#!/bin/bash
printf "Averages: Medians:\n"
while read -r c1 c2 c3 || [ -n "$c3" ]; do
avg=$(( (c1 + c2 + c3)/3 )) ## average row
## sort row
[ $c1 -gt $c2 ] && { tmp=$c1; c1=$c2; c2=$tmp; }
[ $c1 -gt $c3 ] && { tmp=$c1; c1=$c3; c3=$tmp; }
[ $c2 -gt $c3 ] && { tmp=$c2; c2=$c3; c3=$tmp; }
med=$c2 ## pick medain
## print the values in a sane format
printf " %3d %3d\n" "$avg" "$med"
done <"$1"
exit 0
输入文件
$ cat dat/rand10_3.txt
57 99 27
1 35 80
53 28 73
3 98 88
44 57 2
100 99 45
41 3 62
23 8 47
89 25 97
9 17 12
使用/输出强>
$ bash colavg3.sh dat/rand10_3.txt
Averages: Medians:
61 57
38 35
51 53
63 88
34 44
81 99
35 41
26 23
70 89
12 12
注意:您的平均值将反映整数除法的结果,除非您将计算结果传递给bc
或类似的浮点除法。