我有一个如下的数据流:
A,1
A,3
B,4
B,2
C,1
D,5
等等。我想在添加第2列中的值之后,合并基于第1列的行。所以应该是这样的:
A,4
B,6
C,1
D,5
它看起来像是一个典型的MapReduce作业,但我想知道是否有任何命令/bash工具可以在一两行中完成这项任务。我正在处理的文件大小几乎是3-4 KB。
Aho、Weinberger和Kernighan是您的朋友。他们早在1977年就写了AWK来处理这类问题
如果您的数据流位于名为data的文件中,则下面的代码将实现您的目标cat data | awk -F"," '{ a[$1] += $2 } END { for (i in a) { printf "%s,%dn",i,a[i]; } }'
awk
前往救援!
有很多变化,但这需要排序输入,并保持键的顺序
awk -F, -v OFS=, '$1==p{a+=$2} $1!=p{if(p) print p,a; p=$1; a=$2} END{print p,a}' file
A,4
B,6
C,1
D,5
cat file | sed -e "s/(.*),(.*)/1=`expr $1 + 2`/g"
#A=`expr $A + 1`
#A=`expr $A + 3`
#B=`expr $B + 4`
#B=`expr $B + 2`
#C=`expr $C + 1`
#D=`expr $D + 5`
cat file | cut -d',' -f1 | uniq | sed 's/(.)/echo 1,$1/g'
#echo A,$A
#echo B,$B
#echo C,$C
#echo D,$D
( cat file | sed -e "s/(.*),(.*)/1=`expr $1 + 2`/g" ; cat file | cut -d',' -f1 | uniq | sed 's/(.)/echo 1,$1/g') | sh -s
#A,4
#B,6
#C,1
#D,5