组合和汇总来自多个文件的数据

时间:2012-08-01 14:35:00

标签: linux shell

我有两个看起来像这样的文件:

文件1

aaa 5
bbb 2
ccc 9
ddd 46
eee 89
fff 56

文件2

aaa 54
bbb 8
ccc 16
ddd 4
eee 66
fff 9

我想拥有特定列的总和 (例如两个文件中aaa的总和 和ccc的总和+ ddd的总和 和bbb的总和+ eee的总和+ fff的总和)

例如,使用awk有一种简单的方法吗?

4 个答案:

答案 0 :(得分:1)

如果您只想要总和,可以在纯bash中完成(在这里使用关联数组,因此需要bash 4):

declare -A sums
while read name val1 val2; do
  sums[$name]=$(( val1 + val2 ))
done < <(join -j 1 file1 file2)

echo "Sum of aaa: ${sums[aaa]}"
echo "Sums of ccc and ddd: $(( ${sums[ccc]} + ${sums[ddd]} ))"
echo "Sums of bbb, eee, and fff: $(( ${sums[bbb]} + ${sums[eee]} + ${sums[fff]} ))"

答案 1 :(得分:1)

aaa总和的例子:

kent$  awk 'NR==FNR{a[$1]=$2;next;}{a[$1]+=$2}END{print "sum of aaa:",a["aaa"]}' file1 file2
sum of aaa: 59

您可以更改END{xxx}部分以获得不同类型的“总和”:) 例如a["bbb"]+a["eee"]将为您提供bbb + eee

的总和

答案 2 :(得分:0)

连接到一个文件并使用:

awk '{a[$1]+= $2;}END{for(i in a){print i,a[i];}}' file

您可以将cat的输出传递给awk:

cat file1 file2 | awk '...

如果要对输出进行排序,请将其输出以进行排序。

答案 3 :(得分:0)

我做同样的事情,但由于我有大量文件,我不认为使用awk数组连接和求和是一个好主意。

我实际上正在使用它:

join -t$'\t' --check-order -a 1 -a 2 -e 0 -1 1 -2 1 file1 file2 > joined.tmp
awk 'BEGIN{FS="\t"; OFS="\t"}{print $1, $2+$3}' joined.tmp > merged.txt

我一直在寻找一种更快的方法,但我认为,对于大型文件,此解决方案优于之前答案中提出的解决方案。