awk中的键值对

时间:2016-09-23 17:05:04

标签: linux bash awk

我有一串数据,如

 915 1.1.1.1 Sep 21 06
2478 2.2.2.2 Sep 21 07
1960 2.2.2.2 Sep 21 08
 500 1.1.1.1 Sep 21 09

所需的输出如下:

1.1.1.1 1415
2.2.2.2 4438

即。将第一列中的数字相加。我想使用awk文本处理语言来实现相同的目的。我的解决方案是:

echo " 915 1.1.1.1 Sep 21 06
2478 2.2.2.2 Sep 21 07
1960 2.2.2.2 Sep 21 08
 500 1.1.1.1 Sep 21 09"  | awk '{arr[$2]=$1; if($2 in arr ) {val = arr[$2] + $1; arr[$2]=val}} END {for (i in arr) {print i, arr[i]}}'

这似乎不起作用。我不确定我做错了什么。

3 个答案:

答案 0 :(得分:2)

$ awk '{a[$2]+=$1} END{for(k in a) print k,a[k] | "sort" }' file

1.1.1.1 1415
2.2.2.2 4438

答案 1 :(得分:1)

由于你标记了这个bash,我假设原生答案也是可以接受的。以下内容可以复制并粘贴到bash 4.x或更新版本中,并且不需要shell外部的工具:

s=' 915 1.1.1.1 Sep 21 06
2478 2.2.2.2 Sep 21 07
1960 2.2.2.2 Sep 21 08
 500 1.1.1.1 Sep 21 09'

{
  declare -A data=( )
  while read -r size address _; do
    [[ $address ]] || continue
    (( data[$address]+=size ))
  done

  for k in "${!data[@]}"; do
    v=${data[$k]}
    printf '%s\t%s\n' "$k" "$v"
  done
} <<<"$s"

答案 2 :(得分:0)

有效。保持简单。

$ echo " 915 1.1.1.1 Sep 21 06
2478 2.2.2.2 Sep 21 07
1960 2.2.2.2 Sep 21 08
 500 1.1.1.1 Sep 21 09" | awk '{ arr[$2] += $1 } END {for (i in arr) { print i, arr[i] } }'

1.1.1.1 1415
2.2.2.2 4438