【问题标题】:how to write mapreduce in shell如何在shell中编写mapreduce
【发布时间】:2016-03-03 09:10:55
【问题描述】:

我有一些数据,比如

00 13
00 15
01 12
02 52
02 12

以及如何获得mr结果

00 28
01 12
02 64 

我是 bash 的新手,任何建议都将不胜感激!谢谢

【问题讨论】:

  • awk '{a[$1]+=$2}END{for(i in a) print i,a[i])' file
  • 在这里寻找灵感:github.com/erikfrey/bashreduce
  • 那么@123 评论中的代码是否符合您的要求?如果没有,请编辑您的问题以更好地解释您的要求。不要假设阅读本文的 awk 专家知道mapreduce 正在或愿意花费他们的时间(而不是您花费时间)研究您在问题中告诉我们的内容。
  • @123 代码在结束单引号之前缺少结束大括号,易于修复。
  • @123 如果 OP 无法读取语法错误并修复该问题,那么放弃所有希望... :-)。

标签: bash shell awk mapreduce data-processing


【解决方案1】:

@123's comment above的回答:

 awk 'NF { a[$1] += $2 } END { for (i in a) print i, a[i] }' file

这有两个部分。首先,当您解析文件时,具有一个或多个字段的每一行将在索引$1(该行的第一列的值)处增加关联数组a[],并使用$2(第二列的值线)。这会存储您的所有数据,并在找到重复项时添加。

一旦文件被完全解析,END 节就会触发,并且您会在a[] 中循环每个项目i。当给定多个参数时,print 将使用输出字段分隔符(OFS,默认为空格:)将它们分开,因此这将打印数组索引i,一个空格,然后是所有的总和与该索引匹配的输入行 (a[i])。

我添加了NF 测试作为安全措施,以便忽略空白行。 (零字段意味着NF 为零,当评估为布尔值时,零为假,因此不满足条件并且该行不运行任何内容。)

【讨论】:

    【解决方案2】:

    我注意到这个问题没有直接的答案——尽管我同意 awk 解决方案比我在这里给出的解决方案有趣得多。但是我确实想在 Bash 中提供代码,因为它不是很复杂,可能有人想要修改它。

    输入文件应该是空格分隔的键值对列表。

    #/usr/bin/bash
    
    declare -A HASHMAP
    
    while IFS= read -r line
    do
      export $(printf "KEY=%s VALUE=%s" $(echo "$line"))
      HASHMAP["$KEY"]=$((${HASHMAP["$KEY"]} + $VALUE))
    done < input_file
    
    for KEY in "${!HASHMAP[@]}"
    do
        echo "$KEY ${HASHMAP[$KEY]}"
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-07
      • 2013-08-17
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多