2016-04-01 26 views
0

根據cut命令的輸出,是否可以根據所有可能的結果來計算bc將切割操作的輸出傳輸到bc

可以說我有以下列基於文件:

PAK_01896  PAU_03392  75.8 149  32  1  1  145  1  149  *  * 
PAK_02014  PAU_03392  69.8 149  45  0  1  149  1  149  *  * 
PAU_02074  PAU_03392  77.2 149  30  1  1  145  1  149  *  * 
PAU_02206  PAU_03392  69.1 149  46  0  1  149  1  149  *  * 
PAU_02775  PAU_03392  79.2 149  31  0  1  149  1  149  *  * 
PAK_02606  PAU_03392  78.5 149  32  0  1  149  1  149  *  * 
PAU_01961  PAU_03392  67.1 149  49  0  1  149  1  149  *  * 
PAK_03203  PAU_03392  95.3 149  7  0  1  149  1  149  *  * 
PLT_01716  PAU_03392  76.5 149  35  0  1  149  1  149  *  * 
PLT_01758  PAU_03392  79.2 149  31  0  1  149  1  149  *  * 
PAU_03392  PAU_03392  100.0 149  0  0  1  149  1  149  *  * 
PLT_01696  PAU_03392  78.5 149  32  0  1  149  1  149  *  * 
PLT_02424  PAU_03392  78.5 149  32  0  1  149  1  149  *  * 
PLT_01736  PAU_03392  77.2 149  34  0  1  149  1  149  *  * 
PLT_02568  PAU_03392  67.1 149  49  0  1  149  1  149  *  * 
PAK_01787  PAU_03392  66.4 149  50  0  1  149  1  149  *  * 

我希望能夠在某些領域進行一些計算,例如東西總結和/或平均3號的效果柱。在我的腦子裏,我首先想到試試這個:

cut -f3 column_based_file.txt | bc 

但也許並不奇怪這只是返回列中每個項目的值3

我知道有可行的解決方案,這在線程如this one即我可以使用,但是因爲cut是我在bash中操作基於列的數據的一種方法,我只是想知道它是否可能?也許bc有一些標誌同時在一行中讀取和存儲他們等

編輯有在線程一些偉大的解決方案建議,並在給出答案。出於好奇,因爲我原本以爲這樣做,沒有人有基於cutbc的解決方案(如果由於某種原因perl或awk不可用或許?)

+0

請參閱:[殼命令來求和整數,每行一個?](http://stackoverflow.com/q/450799/3776858) – Cyrus

+1

啊,太棒了,沒有遇到那個,因爲我正在用'cut '和'bc'關鍵字。 –

+0

'總和= $(sed -r「s/+/\ t/g」sumavg.csv | cut -f 3 | paste -s -d + - | bc)'。 (我需要sed步驟將空間序列壓縮到一個標籤中)和'lc = $(wc -l sumavg.csv | cut -f1 -d「」)'「作爲行數(注意最後一個數據行結束換行),然後輸出:'echo $ sum'和'echo「scale = 3; $ sum/$ lc」| bc'的平均值 –

回答

3

我會使用awk。我認爲這個任務更適合我。假設你的數據存儲在sumavg.csv,那麼這個GNU awk腳本(sumavg.awk)顯示了第三場的總和與平均值:

{s += $3 } 
END {print "Sum:", s, " Avg: ", s/FNR} 

用命令awk -f sumavg.awk sumavg.csv運行它。

$3是每行的第三個字段,END是一個特殊的模式,它的動作在最後執行,FNR給出了文件中的行數。

+0

啊,非常好!我真的從來沒有正確的理由去處理'awk',但是我懷疑我應該儘早這麼做,而不是遲一點...... –

+0

如果我想讓awk腳本在輸出中打印文件的名稱,我將如何執行那個?使用'END {print「文件是:''$ 3'etc ...}會引發語法錯誤。基於其他線程,我無法弄清楚我做錯了什麼。 –

+0

在END部分使用'print FILENAME',sum:「,s,」Avg:「,s/FNR'。 –