2015-10-17 41 views
2

我试图创建一个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 
+1

你的输入文件是什么样的? – JRD

回答

1

您可以使用paste

paste <(avg_nums ...) <(find_medians ...) | sed '1i\Averages:\tMedians:' 
+0

这很好。无论如何添加一个额外的选项卡之间的功能? – clb

+0

另一个'sed'加上? '粘贴... | sed .... | sed's/\ t/\ t \ t /''?这就是shell编程的美妙之处。祝你好运。 – shellter

+0

是的,我只是通过删除s来实现它的工作:从标题的末尾开始,然后它们都排得很漂亮。谢谢你的帮助! – clb

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或者类似的做浮点除法。