0

我有以下清单:

string1 string2 number

我想计算每对相同的数字的平均值string1 string2

有oneliner来做吗?如果我不需要分别计算每个字符串的平均值,这将非常容易。此外,编写一个执行此操作的 perl 脚本很容易,但我很好奇是否有一个 oneliner。

4

3 回答 3

4

虽然你没有展示你的任何尝试,但它是awk并且忍不住尝试它。这是一种方式:

awk '$0{a[$1" "$2]+=$3; b[$1" "$2]+=1} END{for (i in b) print i, a[i]/b[i]}' file
  • {a[$1" "$2]+=$3; b[$1" "$2]+=1}a[]将值的总和存储在数组中,同时b[]计算该对$1 $2出现的次数。
  • END{for (i in b) print i, a[i]/b[i]}读取文件后打印结果。

测试

$ cat a
hello bye 3
yeah bye 8
hello bye 3
hello bye 9
yeah bye 6
yeah bye 8
$ awk '$0{a[$1" "$2]+=$3; b[$1" "$2]+=1} END{for (i in b) print i, a[i]/b[i]}' a
hello bye 5
yeah bye 7.33333
于 2013-10-25T10:08:45.843 回答
2

对于每一对$k,有总和$h{$k}{s}和对数$h{$k}{c},它们被除以求平均值,

perl -lane'
  $k = join " ", @F[0,1];
  $_->{s} += $F[2], $_->{c}++ for $h{$k};
  END {
    printf("pair (%s), average: %s\n", $_, $h{$k}{s}/$h{$k}{c})
      for sort keys %h;
  }
' file
于 2013-10-25T10:37:45.077 回答
1

这种类型的查询在 SQL 中最容易、最灵活地完成。您可以为此目的使用SQLet和 SQLite:

sqlet.py -d' ' -A file1.txt 'select a1, a2, avg(a3) from A group by a1, a2' | sqlite3
于 2013-10-25T10:08:49.877 回答