我有一串数据,如
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]}}'
这似乎不起作用。我不确定我做错了什么。
答案 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