【问题标题】:Add and merge using bash shell [duplicate]使用 bash shell 添加和合并 [重复]
【发布时间】:2016-04-13 06:28:49
【问题描述】:

我有如下数据流:

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。

【问题讨论】:

  • @TomFenech,这是一个类似的问题,但没有相同的解决方案。所以这个问题增加了这类问题的多样性。感谢您向我指出该问题,但我认为您应该重新考虑您的否决票。
  • 我不知道是什么让你认为我对你的问题投了票 - 我只是链接到你的问题的解决方案。

标签: bash shell mapreduce


【解决方案1】:

AhoWeinbergerKernighan 是您的朋友。他们早在 1977 年就写了AWK 来处理这类问题。
如果您的数据流位于名为 data 的文件中,下面的代码将实现您的目标。
cat data | awk -F"," '{ a[$1] += $2 } END { for (i in a) { printf "%s,%d\n",i,a[i]; } }'

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

        猜你喜欢
        • 2019-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-24
        • 1970-01-01
        • 1970-01-01
        • 2012-08-17
        • 2012-10-28
        相关资源
        最近更新 更多