У меня есть данные c геноми, которые я извлек из файла vcf, распространенного типа файлов в генетике. Подмножество его выглядит следующим образом.
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT sub1 sub2 sub3
22 18171776 rs61741787 A G . . PR GT 1/1 1/1 1/1
22 18171842 rs147280257 G T . . PR GT 1/1 1/1 1/1
22 18209920 rs9306198 T C . . PR GT 1/1 1/1 0/1
22 18209989 rs144030966 A G . . PR GT 1/1 1/1 1/1
22 18893995 rs409155 G C . . PR GT 1/1 1/1 1/1
22 18898420 rs146390355 A G . . PR GT 1/1 1/1 1/1
22 18898468 rs139729355 A G . . PR GT 0/1 1/1 1/1
22 19183787 rs1633399 G A . . PR GT 1/1 0/1 1/1
Однако в фактическом файле 81 строка и 337 498 столбцов.
Я пытаюсь транспонировать файл, используя следующий сценарий awk.
awk '
{
for (i=1; i<=NF; i++) {
a[NR,i] = $i
}
if (NF>cols) {cols=NF}
}
END {
for(j=1; j<=cols; j++) {
str=a[1,j]
for(i=2; i<=NR; i++){
str=str"\t"a[i,j]
}
print str
}
}' input_file \
> transposed_output_file
Я понимаю, что этот сценарий требует, чтобы awk удерживал весь файл в памяти. Однако сценарий использует гораздо больше памяти, чем размер файла. Размер входного файла - 131 МБ, но после запуска сценария в кластере seff
сообщает мне, что пиковое использование памяти было 5,05 ГБ. Это проблема, потому что я хочу запустить тот же сценарий для файла гораздо большего размера. Использование сценария с этим входным файлом размером 5,3 ГБ дает мне ошибку нехватки памяти даже после выделения 100 ГБ. Информация? Как избежать этой проблемы?
Спасибо за помощь!