Linux 计算文本文件中的一致性和相关性

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

我有一个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 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.已更新并完成。