2017-01-19 5 views
3

ファイルのすべての列の合計を出力するループをBashに書き込もうとしています。これらの列はタブで区切られています。私が今までに持っているのはこれです:列の合計を計算するBashループ

cols() { 
    count=$(grep -c $'\t' $1) 
    for n in $(seq 1 $count) ;do 
    cat $FILE | awk '{sum+=$1} END{print "sum=",sum}' 
    done 
} 

しかし、これは最初の列の合計だけを出力します。すべての列でこれを行うにはどうすればよいですか?

+0

脇に:[shellcheck.net](http://shellcheck.net)でコードを貼り付けることで、コードを改善するためのヒントを得ることができます。 – mklement0

+0

[bashを使用してファイル内の各列を合計する方法](http://stackoverflow.com/questions/14956264/how-to-sum-each-column-in-a-file-using-bash) –

答えて

3

あなたのアプローチは、仕事をしていませんが、それはやり過ぎ何とかです:あなたは、ファイルをcatティンの列の数をカウントし、awkを呼び出している、一人でawkはそれのすべてを行うことができますが:

awk -F"\t" '{for(i=1; i<=NF; i++) sum[i]+=$i} END {for (i in sum) print i, sum[i]}' file 

これをNFを利用して、ラインに含まれるフィールドの数を格納します(これは、count=$(grep -c $'\t' $1)で行っています)。次に、フィールドをループして配列のすべての要素に合計します。sum[i]には、列の合計が含まれます。i。最後に、結果をループして値を書き込みます。

あなたのアプローチが特定の列を合計しないのはなぜですか?あなたが言うときので:

for n in $(seq 1 $count) ;do 
    cat $FILE | awk '{sum+=$1} END{print "sum=",sum}' 
done 

あなたは常に合計に要素として$1を使用しています。あなたが唯一の解決策はbashの組み込みをしたい場合は、これがうまくいく

awk -v col="$n" '{sum+=$col} END{print "sum=",sum}' $FILE # no need to cat $FILE 
0

:代わりに、あなたは次のようなものを使って、awkのに価値$nを渡す必要があり

declare -i i l 
declare -ai la sa=() 
while read -d$'\t' -ra la; do 
    for ((l=${#la[@]}, i=0; i<l; sa[i]+=la[i], ++i)); do :; done 
done < file 
(IFS=$'\t'; echo "${sa[*]}") 

これのパフォーマンスがまともである必要があり、 awkのようなものよりかなり遅いです。

関連する問題