Изменение SNP в 00, 11, 20 в файле на двухаллельный буквенный аллель с использованием другого файла, который содержит нуклеотиды в качестве файла карты

#loops #file #awk #numbers #raw

#петли #файл #awk #числа #raw

Вопрос:

У меня есть raw.txt файл:

 FID IID FA  MO  SEX PHENO   SNP1    SNP2    SNP3    SNP4
1   1   0   0   1   1   20  00  20  11
1   2   0   0   1   1   11  00  20  20
1   3   0   0   1   1   11  20  11  20
1   4   0   0   1   1   00  11  11  20
  

А snp.txt файл:

 1   SNP1    20  A   G
1   SNP2    45  T   C
1   SNP3    56  A   G
1   SNP4    80  C   G
  

Мой выходной файл должен выглядеть следующим образом (после преобразования чисел из столбца 7 в буквы в raw.txt на основе столбцов 4 и 5 в snp.txt ):

 FID IID FA  MO  SEX PHENO   SNP1    SNP2    SNP3    SNP4
1   1   0   0   1   1   AA  CC  AA  CG
1   2   0   0   1   1   AG  CC  AA  CC
1   3   0   0   1   1   AG  TT  AG  CC
1   4   0   0   1   1   GG  TC  AG  CC
  

Столбец 2 файла snp.txt являются заголовками для файла raw.txt начиная с столбца 7 (raw.txt ). Столбцы 4 и 5 файла snp.txt представьте минорные и основные аллели SNP в столбце 2. Я хочу, чтобы столбцы в SNP1, SNP2, SNP3 и SNP4, которые находятся в формате 0,1,2, были преобразованы в формат ACGT с использованием столбцов 4 и 5 в качестве карты.

Столбцы SNP1, SNP2, SNP3 и SNP4 из raw.txt представляют 0,1 или 2 копии минорного аллеля (4-й столбец snp.txt). Столбец 5 является основным аллелем. Если SNP1 равен 20, как показано на raw.txt , есть 2 копии минорного аллеля, который в соответствии с snp.txt — это A. Следовательно, 20 должно измениться на AA (2 из 20 — это количество минорных аллелей A). SNP1 11 указывает, что существует 1 копия минорного аллеля. Следовательно, 11 должно быть AG. SNP1 00 указывает, что нет копии минорного аллеля, а есть только мажорные аллели. Следовательно, 00 должно быть GG (2 копии буквы в столбце 5) файла snp.txt .

На самом деле, у меня более 65 000 snp, что означает, что в файле столько столбцов raw.txt . У меня есть приведенный ниже код (код, который я нашел в stackoverflow, который я немного отредактировал :

 awk 'NR==FNR {a[$2,20]=$4$4; a[$2,11]=$4$5; a[$2,"00"]=$5$5; next} $7~/^[0-2]/ {
     $7=a["SNP1",$7]; $8=a["SNP2",$8];9=a["SNP3",$9];$10=a["SNP4",$10]}1'
snp.txt raw.txt > output.txt
  

Это делает то, что я хочу, если файл raw.txt имеет только 4 snp. Я не знаю, как выполнить этот цикл по полям из столбца 7 из raw.txt когда у меня более 65 000 snp. Мне нужен код an (предпочтительно на языке awk), который может перебирать многочисленные столбцы raw.txt для изменения SNP в формате 00, 11, 20 на двухаллельные буквенные форматы. Спасибо.

Ответ №1:

Ваш awk хорош! Вот как это сделать для переменного числа snp.

 > cat tst.awk 
NR==FNR {
    snp[$2 "20"] = $4 $4
    snp[$2 "11"] = $4 $5
    snp[$2 "00"] = $5 $5
    next
}

FNR==1 { # read the columns/snps
    for (i=7;i<=NF;i  ) col[i] = $i
    print
    next
}

{
    for (i=7;i<=NF;i  ) $i = snp[col[i] $i]
    print
}
  

Использование:

 > awk -f tst.awk snp.txt raw.txt 
FID IID FA  MO  SEX PHENO   SNP1    SNP2    SNP3    SNP4
1 1 0 0 1 1 AA CC AA CG
1 2 0 0 1 1 AG CC AA CC
1 3 0 0 1 1 AG TT AG CC
1 4 0 0 1 1 GG TC AG CC
  

Модификация заключается в том, что мы читаем заголовок и сохраняем SNP, позже мы используем их для сопоставления. Оба действия выполняются с помощью обычного for цикла, от нужного нам столбца до последнего столбца ( NF ), остальное — это то, что вы уже делаете, помимо некоторого более четкого синтаксиса.