簡體   English   中英

AWK 遍歷列以計算匹配項

[英]AWK looping through columns to count matches

我有一個制表符分隔的文件,如下所示:

樣品編號 單核苷酸多態性 最低限度 合子 樣本1 樣品2 樣品3
311 rs1490413 一種 G 一種 G
311 rs730123 G 一種 G 一種
311 rs7532151 一種 一種 C C
311 rs1434369 G G
311 rs1563172 C C

理論上,樣本數量以及列 $5-$i 是無限的。

我想計算同一行中同一字母在 3 美元和 5 美元之間,然后是 6 美元,然后是 7 美元等之間的總出現次數,並將結果值除以總行數(標題除外)

到目前為止,我可以為每對分別做,例如 3 美元和 5 美元,如下所示:

awk 'BEGIN {
    FS = OFS = "\t"
}

$3 == $5 {
    ++count
}

END {
    print count/(NR-1)
}

' infile

我想循環執行並獲得如下輸出:

樣品編號 樣本1 樣品2 樣品3
311 0.4 0.6 0

有人可以幫忙嗎?

也許這種方法行得通?

awk '
BEGIN{
    OFS="\t"; printf "%s\t", "SampleID"
}
NR==1{
    for(i=5;i<=NF;i++){
        printf "Sample%s\t", (i-4)
    }
}
NR>1{
    sample[$1]++
    !sampleID[$1]++
    for(i=5;i<=NF;i++){
        if($3 == $i){
            count[$1, i]++
        }
    }
}
END{
    for (j in sampleID) {
        print ""
        printf "%s\t", j
        for(i=5;i<=NF;i++){
            printf "%s\t", count[j, i] / sample[j]
        }
    }
}' inputfile

SampleID  Sample1  Sample2  Sample3
311       0.4      0.6      0

這些值不是除以 (NR-1),而是除以 SampleID 行數。 因此,如果文件中有其他 sampleID:

cat test.txt
SampleID    dbSNP   Min.alle    M.zygo  Sample1 Sample2 Sample3
311 rs1490413   A   Homo    G   A   G
311 rs730123    G   Homo    A   G   A
311 rs7532151   A   Homo    A   C   C
311 rs1434369   G   Homo    T   G   T
311 rs1563172   T   Homo    T   C   C
312 rs1490413   A   Homo    G   A   G
312 rs730123    G   Homo    A   G   A
312 rs7532151   A   Homo    A   C   C
312 rs1434369   G   Homo    T   G   T
312 rs1563172   G   Homo    T   C   C

awk '
BEGIN{
    OFS="\t"; printf "%s\t", "SampleID"
}
NR==1{
    for(i=5;i<=NF;i++){
        printf "Sample%s\t", (i-4)
    }
}
NR>1{
    sample[$1]++
    !sampleID[$1]++
    for(i=5;i<=NF;i++){
        if($3 == $i){
            count[$1, i]++
        }
    }
}
END{
    for (j in sampleID) {
        print ""
        printf "%s\t", j
        for(i=5;i<=NF;i++){
            printf "%s\t", count[j, i] / sample[j]
        }
    }
}' test.txt
SampleID    Sample1 Sample2 Sample3
311         0.4     0.6     0
312         0.2     0.6     0

根據文件的大小,可能值得為此任務查看其他語言,即這在 R 中相對微不足道:

library(dplyr)

df <- read.table(text = "SampleID   dbSNP   Min.alle    M.zygo  Sample1 Sample2 Sample3
311 rs1490413   A   Homo    G   A   G
311 rs730123    G   Homo    A   G   A
311 rs7532151   A   Homo    A   C   C
311 rs1434369   G   Homo    T   G   T
311 rs1563172   T   Homo    T   C   C", header = TRUE)

df %>%
  group_by(SampleID) %>%
  summarise(across(starts_with("Sample"), ~mean(.x == Min.alle)))
#> # A tibble: 1 × 4
#>   SampleID Sample1 Sample2 Sample3
#>      <int>   <dbl>   <dbl>   <dbl>
#> 1      311     0.4     0.6       0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM