2017-03-08 49 views
0

該腳本將適當的列(即每一行總和出現在所指示的列中的數字相加)合併在一起,創建結果列的數字並將它寫入標準輸出。在沒有參數「列」的默認情況下,列數假設1.Bash - 對於每一行總和,[列出的參數]指示的列中出現的數字

用法:./script.sh文件名[列1 ...]

這是我有什麼要總結NUM每行。

#!/bin/bash 

if [ $# -lt 2 ] 
then 
    echo "Usage: ./script.sh filename [column1 column2 ...]" 
fi 

filename=$1 
shift 

while read line 
do 
    sum=0 
    for num in $line 
    do 
    let sum=sum+num 
    done 
    echo "Sum: " $sum 
done < $filename 

如何總結在由參數表示的列存在的每行的數[列1列2 ....],並創建將所得的數字列,並將其寫入到stdout。請給我一些想法應該用什麼工具來解決這個問題。

+0

*請給我一些想法應該用什麼工具來解決這個問題。* ** awk ** – dawg

+0

'awk'很好。沒有'awk',你可以使用一些工具('cut'或'sed')來首先提取colums。當你不想循環使用'((sum + = i))'添加每個字段的剩餘值時,可以將所有內容連接到一行('tr'\ n'''')並使用'tr'again用'+'替換空格。現在你有一個字符串,你可以'''到'bc'。 –

回答

0

只需通過擴大現有的腳本中,這樣的事情應該工作(未測試):

#!/bin/bash 

if [ $# -lt 2 ];then 
    echo "Usage: ./script.sh filename [column1 column2 ...]" && exit 1 
    #exit the script - no further processing 
fi 

[ ! -f $1 ] && echo "Filename given not a valid file-exiting" && exit 1 

filename=$1 && shift 

while [ $# -ge 1 ];do #Read all args and put them in an array 
    toadd+=("$1") && shift 
done 

while read -r line;do   #Read line from file 
    read -ra columns <<<"$line" #split the line into field using an array 
    sum=0 
    for i in "${toadd[@]}";do  #For items in array $toadd 
    num="${columns[$i-1]}"  #get the corresponding element from array columns 
    let sum=sum+num 
    done 

    echo "Sum: " $sum 
done < $filename 
exit 0 

PS:這對文件的空間分隔的記錄(COL1 COL2 ....)

+0

謝謝。 @George_Vasiliou你的解決方案幫助 – ventumdei

相關問題