首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算列总和的Bash循环

问计算列总和的Bash循环
EN

Stack Overflow用户
提问于 2017-01-20 06:26:23
回答 2查看 626关注 0票数 3

我正在尝试用Bash编写一个循环来打印文件中每一列的总和。这些列由制表符分隔。到目前为止,我得到的是:

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

但这只打印出第一列的总和。如何才能对每一列执行此操作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-20 06:29:00

您的方法完成了这项工作,但在某种程度上有些夸张:您先计算列数,然后对文件执行cat操作并调用awk,而awk本身就可以完成所有这些工作:

代码语言:javascript
复制
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的总和。最后,它遍历结果并写入它的值。

为什么你的方法不是对一个给定的专栏进行求和?因为当你说:

代码语言:javascript
复制
for n in $(seq 1 $count) ;do
    cat $FILE | awk '{sum+=$1} END{print "sum=",sum}'
done

您总是使用$1作为求和的元素。相反,您应该使用以下内容将值$n传递给awk:

代码语言:javascript
复制
awk -v col="$n" '{sum+=$col} END{print "sum=",sum}' $FILE # no need to cat $FILE
票数 3
EN

Stack Overflow用户

发布于 2017-01-20 08:36:49

如果你想要一个只有bash内置的解决方案,这是可行的:

代码语言:javascript
复制
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之类的要慢得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41752870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档