Linux 计算文本文件中的一致性和相关性
我有一个4列300行的文件。每个Id出现两次。根据第4列是否同时匹配两个id(如id 2和id 3),计算匹配的百分比。在这种情况下,两个ID完全匹配(两个引用都匹配),因此它将为2/4=0.5。还要计算单个匹配的百分比。并计算第2列和第3列之间的相关性。我知道如何在excel中执行此操作,但它太耗时,因为我有许多文件。我们如何在linux中做到这一点?可能是awk或sed 我的文件内容如下Linux 计算文本文件中的一致性和相关性,linux,awk,sed,Linux,Awk,Sed,我有一个4列300行的文件。每个Id出现两次。根据第4列是否同时匹配两个id(如id 2和id 3),计算匹配的百分比。在这种情况下,两个ID完全匹配(两个引用都匹配),因此它将为2/4=0.5。还要计算单个匹配的百分比。并计算第2列和第3列之间的相关性。我知道如何在excel中执行此操作,但它太耗时,因为我有许多文件。我们如何在linux中做到这一点?可能是awk或sed 我的文件内容如下 1 12 12 match 1 13 12 mismatch 2 5 5 match 2 4 4 mat
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
在awk中(从中计算相关性)。两次。第一次运行计算$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
相关性是如何计算的?awk对我来说似乎非常足够。它可以逐行处理您的文件。计算是可能的。(脚本语言在某种程度上类似于C。算术运算符和函数以及分支和循环语句(
if
,for
,while
))。您可以使用变量(无需声明)来管理全局状态。甚至功能也可用。你会发现很多谷歌的教程和例子。顺便说一句,恐怕你的问题离题了。许多语言都可以做到这一点,所以请告诉我们你的尝试和你的困境?我建议先解决每个问题,然后再把它们全部结合起来。除了上面的问题,我还要问为什么1/8而不是.125?是否有小数限制?我尝试了excel,首先对col4进行排序,条件匹配并突出显示重复ID,根据突出显示的单元格进行排序,然后计算百分比和相关性。@akang,再次详细说明计算第2列和第3列之间的相关性好的,我需要先吃早餐。brb.已更新并完成。