优化后的代码如下:

awk -v OFS='\t' ' BEGIN { split(patients, patient_list, ",") } NR == 1 { for (i=1; i<=NF; i++) { a[$i] = i } for (i=1; i<=length(patient_list); i++) { patient_index[patient_list[i]] = a[patient_list[i]] } print $a["#CHROM"], $a["POS"], $a["ID"], $a["REF"], $a["ALT"], $a["QUAL"], $a["FILTER"], $a["INFO"], $a["FORMAT"] } NR >= 2 { for (i=1; i<=length(patient_list); i++) { printf "%s", $(patient_index[patient_list[i]]) if (i < length(patient_list)) { printf OFS } } printf "\n" }' <(grep -v "##" "$vcf") > "$dirdate/vcf_noheader_patient"

代码说明:

  1. 用 awk 代替 grep 和 awk 的两次执行,从而减少中间文件的生成和处理,提高性能。
  2. 用数组和循环提高代码的可读性和可维护性。
  3. 用命令替换代替文件操作,提高代码的简洁性和可靠性
减少中间文件优化这个代码。优化易读性和逻辑以及性能		grep -v ## $vcf awk BEGINOFS=tNR==1fori=1;i=NF;i++a$i=iNR=1print $a#CHROM$aPOS$aID$aREF$aALT$aQUAL$aFILTER$aINFO$aFORMAT $dirdatevcf_noheader		for i in $patient ; do			grep

原文地址: https://www.cveoy.top/t/topic/cEw2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录