2017-01-19 3 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 

Этого использует , который хранит количество полей, которые имеет линия (это то, что вы делали с 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 в качестве элемента суммы. Вместо этого, вы должны передать значение $n в AWK, используя что-то вроде:

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

Если вы хотите Баш предопределённого единственным решения, это будет работать:

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.

Смежные вопросы