我有 2 个看起来像这样的文件:
文件 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 做到这一点?
如果您只是想要总和,这可以在纯 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]} ))"
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 的总和
我也在做同样的事情,但是由于我有很大的文件,我不认为使用 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
我一直在寻找一种更快的方法,但我认为,对于大文件,这个解决方案比之前的答案中提出的解决方案要好。
连接成一个文件并使用:
awk '{a[$1]+= $2;}END{for(i in a){print i,a[i];}}' file
您可以通过管道将输出从 cat 传输到 awk:
cat file1 file2 | awk '...
如果要对输出进行排序,请将其通过管道排序。