如何在两列中的每一列旁边显示两个函数旁边的输出 - Bash脚本
问题描述:
我试图创建一个bash脚本来计算文本文件的行和列的平均值和中值。我有平均和中值工作的功能,但是我想格式化行的输出(列格式很好)。如何在两列中的每一列旁边显示两个函数旁边的输出 - 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
所以,很显然没有什么我都试过了工作。我对bash脚本也很陌生,只是你知道。有没有人有任何建议如何让这个工作?我是否以这种错误的方式去做?谢谢。
编辑:我的输入文件如下(由制表符分隔)
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
答
有一些接近问题的方式。值得庆幸的是,您并不是在寻找列数和中位数,这意味着如果我正确地理解了您,则无需在脚本持续时间内存储所有值,并可专注于行平均值和行中位数。
当然,平均值很容易,中位数需要某种形式的排序值来逐行选择中值。但是,限于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
或者类似的做浮点除法。
你的输入文件是什么样的? – JRD