使用bash shell添加和合并

时间:2016-04-12 12:51:36

标签: bash shell mapreduce

我有一个数据流如下:

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。

3 个答案:

答案 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)

AhoWeinbergerKernighan是您的朋友。他们在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