从外壳GROUP BY / SUM从外壳GROUP BY / SUM(GROUP BY/SUM fr

2019-05-13 15:07发布

我有一个包含这样的数据的大文件:

a 23
b 8
a 22
b 1

我希望能够得到这样的:

a 45
b 9

我可以先整理这个文件,然后通过扫描该文件一旦做到这一点在Python。 什么是这样做的一个很好的直接命令行方式?

Answer 1:

编辑:现代(GNU / Linux)的解决方案,因为几年前在;-)评论提及。

awk '{
    arr[$1]+=$2
   }
   END {
     for (key in arr) printf("%s\t%s\n", key, arr[key])
   }' file \
   | sort -k1,1

在最初发布的解决方案,基于旧的Unix sort选项:

awk '{
    arr[$1]+=$2
   }
   END {
     for (key in arr) printf("%s\t%s\n", key, arr[key])
   }' file \
   | sort +0n -1

我希望这有帮助。



Answer 2:

无需AWK这里,甚至排序 - 如果你有猛砸4.0,可以使用关联数组:

#!/bin/bash
declare -A values
while read key value; do
  values["$key"]=$(( $value + ${values[$key]:-0} ))
done
for key in "${!values[@]}"; do
  printf "%s %s\n" "$key" "${values[$key]}"
done

...或者,如果首先排序文件(这将是更多的内存效率; GNU排序是能够做到的技巧,比内存较大的文件,排序其中一个天真的脚本 - 无论是在awk中,Python或壳 - 一般不会),你可以在一个方式,这将在旧版本的工作(我希望做到这一点,通过下面的bash 2.0工作):

#!/bin/bash
read cur_key cur_value
while read key value; do
  if [[ $key = "$cur_key" ]] ; then
    cur_value=$(( cur_value + value ))
  else
    printf "%s %s\n" "$cur_key" "$cur_value"
    cur_key="$key"
    cur_value="$value"
  fi
done
printf "%s %s\n" "$cur_key" "$cur_value"


Answer 3:

这Perl的一个班轮似乎做的工作:

perl -nle '($k, $v) = split; $s{$k} += $v; END {$, = " "; foreach $k (sort keys %s) {print $k, $s{$k}}}' inputfile


Answer 4:

使用一种方法perl

perl -ane '
    next unless @F == 2; 
    $h{ $F[0] } += $F[1]; 
    END { 
        printf qq[%s %d\n], $_, $h{ $_ } for sort keys %h;
    }
' infile

内容infile

a 23
b 8
a 22
b 1

输出:

a 45
b 9


Answer 5:

随着GNU AWK(版本低于4):

WHINY_USERS= awk 'END {
  for (E in a)
    print E, a[E]
    }
{ a[$1] += $2 }' infile

GNU AWK> = 4:

awk 'END {
  PROCINFO["sorted_in"] = "@ind_str_asc"
  for (E in a)
    print E, a[E]
    }
{ a[$1] += $2 }' infile


Answer 6:

这可以通过以下单衬可以轻松实现:

cat /path/to/file | termsql "SELECT col0, SUM(col1) FROM tbl GROUP BY col0"

要么。

termsql -i /path/to/file "SELECT col0, SUM(col1) FROM tbl GROUP BY col0"

这里Python包, termsql ,被使用,其是围绕的SQLite的包装。 请注意,目前它没有上传到PyPI中 ,也只能安装系统级( setup.py是一个小破),如:

sudo pip install https://github.com/tobimensch/termsql/archive/master.zip


文章来源: GROUP BY/SUM from shell