我有以下清单:
string1 string2 number
我想计算每对相同的数字的平均值string1 string2
。
有oneliner来做吗?如果我不需要分别计算每个字符串的平均值,这将非常容易。此外,编写一个执行此操作的 perl 脚本很容易,但我很好奇是否有一个 oneliner。
虽然你没有展示你的任何尝试,但它是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
对于每一对$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
这种类型的查询在 SQL 中最容易、最灵活地完成。您可以为此目的使用SQLet和 SQLite:
sqlet.py -d' ' -A file1.txt 'select a1, a2, avg(a3) from A group by a1, a2' | sqlite3