在bash中汇总所有文件的第二列

时间:2012-04-18 21:33:47

标签: bash sum

我有以这种格式的1-N文件:

文件1:

1 1
2 5
3 0
4 0
5 0

文件2:

1 5
2 1
3 0
4 0
5 1

作为输出,我想对所有文件的所有第二列求和,因此输出如下所示:

输出:

1 6
2 6
3 0
4 0
5 1

非常感谢。

(或者我最好自动对所有具有相同名称的文件进行此操作,但以不同的编号开头,例如1A.txt,2A.txt,3A.txt作为一个输出和1AD.txt ,2AD.txt,3AD.txt作为下一个输出)

4 个答案:

答案 0 :(得分:3)

这样的事情应该有效:

cat *A.txt | awk '{sums[$1] += $2;} END { for (i in sums) print i " " sums[i]; }'

cat *AD.txt | awk '{sums[$1] += $2;} END { for (i in sums) print i " " sums[i]; }'

答案 1 :(得分:2)

快速求和解决方案可以在awk

中完成
{ sum[$1] += $2; }
END { for (i in sum) print i " " sum[i]; }

通过构建后缀列表然后为它们进行通配,可以最简单地对输入文件进行分组:

ls *.txt | sed -e 's/^[0-9]*//' | while read suffix; do
   awk '{ sum[$1] += $2; } END { for (i in sum) print i " " sum[i]; }' *$suffix > ${suffix}.sum
done

答案 2 :(得分:1)

#!/bin/bash

suffixes=$(find . -name '*.txt' | sed 's/.*[0-9][0-9]*\(.*\)\.txt/\1/' | sort -u)

for suffix in ${suffixes}; do
  paste *${suffix}.txt | awk '{sum = 0; for (i = 2; i <= NF; i += 2) sum += $i;
                               print $1" "sum}' > ${suffix}.sums.txt
done

exit 0

答案 3 :(得分:1)

Pure Bash:

declare -a sum
for file in *A.txt; do
  while read a b; do
    ((sum[a]+=b))
  done < "$file"
done

for idx in ${!sum[*]}; do       # iterate over existing indices
  echo  "$idx ${sum[$idx]}"
done