优化阅读性和性能尽量减少中间文件给出代码 if $length -eq 1 ; then grep -v ## $vcf awk -v patient=$patient BEGINOFS=tNR==1fori=1;i=NF;i++a$i=iNR=1print $a#CHROM$aPOS$aID$aREF$aALT$aQUAL$aFILTER$aINFO$aFORMAT$apatient $d
优化后的代码如下:
if [[ $length -eq 1 ]]; then awk -v patient="$patient" 'BEGIN{OFS="\t"}!/##/{if(NR==1){for(i=1;i<=NF;i++){a[$i]=i}}else{print $a["#CHROM"],$a["POS"],$a["ID"],$a["REF"],$a["ALT"],$a["QUAL"],$a["FILTER"],$a["INFO"],$a["FORMAT"],$a[patient]}}' "$vcf" > "$dirdate/vcf_noheader_patient" else echoContent skyBlue "你输入了$length个病人" awk 'BEGIN{OFS="\t"}NR==1{for(i=1;i<=NF;i++){a[$i]=i}}NR>=1{print $a["#CHROM"],$a["POS"],$a["ID"],$a["REF"],$a["ALT"],$a["QUAL"],$a["FILTER"],$a["INFO"],$a["FORMAT"]}' "$vcf" > "$dirdate/vcf_noheader" for i in ${patient//,/ }; do awk -v patient="$i" 'BEGIN{OFS="\t"}NR==1{for(i=1;i<=NF;i++){a[$i]=i}}NR>=1{print $a[patient]}' "$vcf" > "$dirdate/vcf_patient_$i" done paste "$dirdate/vcf_noheader" "$dirdate/vcf_patient"* > "$dirdate/vcf_noheader_patient" fi
优化说明:
1. 使用 awk 代替 grep 和 awk 的组合,一次遍历即可得到需要的数据,减少了中间文件的生成和读写操作,提高了性能;
2. 将处理相同字段的代码提取出来,避免了代码的重复,提高了代码的可维护性;
3. 使用双引号包裹变量,避免了变量拼接时出现的语法错误;
4. 将输出重定向符号放在命令的结尾,避免了输出重定向符号与文件名之间出现的空格问题
原文地址: https://www.cveoy.top/t/topic/cFDT 著作权归作者所有。请勿转载和采集!