#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
), остальное — это то, что вы уже делаете, помимо некоторого более четкого синтаксиса.