2015-10-17 37 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或者類似的做浮點除法。