2017-07-07 43 views
-1

我有一個包含4列和300行的文件。每個Id出現兩次。根據第4列是否匹配兩次出現的id(如id 2和3),計算匹配百分比。在這種情況下,2個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 
+2

如何計算相關性? – Inian

+0

awk對我來說似乎非常充分。它可以逐行處理您的文件。計算是可能的。 (腳本語言與C類似。算術運算符和函數以及分支和循環語句('if','for','while'))。您可以使用變量(無需聲明)來管理全局狀態。即使功能可用。你會發現很多教程和谷歌的例子。順便說一句。恐怕,你的問題是無關緊要的。 – Scheff

+0

許多語言都可以這樣做,所以請向我們展示您的嘗試以及您卡在哪裏?我會建議在加入之前爲每個人解決問題。除了上面的問題,我還會問爲什麼1/8而不是.125?是否有小數限制? – grail

回答

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 
+0

好的,我需要早餐。 BRB。 –

+0

已更新並完成。 –