我有一个数据流如下:
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。
答案 0 :(得分:2)
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
答案 1 :(得分:2)
Aho,Weinberger和Kernighan是您的朋友。他们在1977年写了AWK来处理这类问题。
如果你的数据流在一个名为data的文件中,下面的代码将实现你的目标。
cat data | awk -F"," '{ a[$1] += $2 } END { for (i in a) { printf "%s,%d\n",i,a[i]; } }'
答案 2 :(得分:0)
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