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

时间:2017-07-07 07:00:44

标签: linux awk sed

我有一个包含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

1 个答案:

答案 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