Този bash скрипт е предназначен да бъде част от конвейер, който обработва компресиран .vcf файл, който съдържа геноми от множество пациенти (което означава, че файловете са огромни, дори когато са компресирани, като 3-5 GB).
Проблемът ми е, че постоянно ми липсва памет, когато изпълнявам този скрипт. Изпълнява се във виртуална машина с висока памет на GCP.
Надявам се, че има начин да се оптимизира използването на паметта, така че това да не се провали. Разгледах го, но не намерих нищо.
#!/bin/bash
for filename in ./*.vcf.gz; do
[ -e "$filename" ] || continue
name=${filename##*/}
base=${name%.vcf.gz}
bcftools query -l "$filename" >> ${base}_list.txt
for line in `cat ${base}_list.txt`; do
bcftools view -s "$line" "$filename" -o ${line}.vcf.gz
gzip ${line}.vcf
done
done
bcftools query
/view
,gzip
илиfor line in `cat ...`
? - person Socowi   schedule 22.01.2021[ -e "$filename" ]
най-вероятно е безполезен.*.csv.gz
изброява само файлове и директории, които съществуват.-e
проверява дали$filename
съществува. Ако искате да сте сигурни, че$filename
е файл, а не директория, използвайте-f
. - person Socowi   schedule 22.01.2021*.csv.gz
изброява само файлове и директории, които съществуват =› не, ако моделът не съответства на нито един файл (освен акоshopt -s nullglob
). В този случай ще получитеfilename=*.csv.gz
и това е причината за-e
теста IMO. Ако името на файла трябва да сочи към файл, тогава тестът-f
би бил по-добър. - person xhienne   schedule 22.01.2021