我有一个包含4列和300行的文件。每个Id都出现两次。基于第4列是否匹配2次出现的id(如id 2和3),计算匹配的百分比。在这种情况下,2个ID完全匹配(两个匹配项都匹配),因此它将是2/4 = 0.5。还计算单个匹配的百分比。并计算第2列和第2列之间的相关性。第3列。我知道如何在Excel中执行此操作,但由于我有很多文件,因此太耗时。我们怎么能在linux中做到这一点?可能是awk或sed。
我的文件内容如下
1 12 12 match
1 13 12 mismatch
2 5 5 match
2 4 4 match
3 17 17 match
3 12 12 match
4 12 13 mismatch
4 12 14 mismatch
期望的输出
Perfect match =0.5, Single match =1/8 =0.1, Correlation = 0.98
答案 0 :(得分:2)
在awk中(来自https://www.mathsisfun.com/data/correlation.html的相关计算)。两次跑。首次运行计算$2
和$3
的均值,第二次运行所有其他值:
$ awk '
NR==FNR { # first run
v2s+=$2 # var $2 sum
v3s+=$3 # var $3 sum
next
}
FNR==1 { # for the first record of second run
v2m=v2s/(NR-1) # var 2 mean
v3m=v3s/(NR-1) # var 3 mean
}
{
m[$1]+=($4=="match") # count matches for each pair
a=$2-v2m # a as in the link above $2-mean
b=$3-v3m # b too as above
ab+=a*b # ab
a2+=a*a # a squared all summed up
b2+=b*b # b squared as well
}
END {
for(i in m) {
print i, m[i]
if(m[i]==2)
pm+=2 # perfect matches
if(m[i]==1)
sm+=2 # single matches
}
print "Perfect match= " pm/FNR " Single match= " sm/FNR " Correlation= " ab/sqrt(a2*b2)
}' file file
Perfect match= 0.5 Single match= 0.25 Correlation= 0.979748