微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么gawk在“ printf”调用之间添加额外的空格?

如何解决为什么gawk在“ printf”调用之间添加额外的空格?

我正在研究一个脚本,该脚本使用gawk从GTF文件提取行,并且在连续调用“ printf”之间添加一个额外的空格。对于不熟悉GTF文件的人,它们是一种常见的基因组格式,由9个制表符分隔的字段组成,其中第9个字段存储由分号和空格“;”分隔的键-值属性对列表。目的是提取输入文件1中作为单个文本列传递的带有特定“ gene_name”的行并提取

处理脚本中的所有内容均按预期工作,除了在内部for循环的最终printf迭代与插入“换行符”的printf语句之间引入了多余的空格之外。

示例输入文件1:

(base) [user@host MouseEnsembl100]$ head gene_names.txt
Cryaa
Cryab
Crygc

示例输入GTF文件文件2):

(base) [user@host MouseEnsembl100]$ head example.gtf
17  ensembl_havana  gene    31677807    31681733    .   +   .   gene_id "ENSMUSG00000024041"; gene_version "10"; gene_name "Cryaa";
17  havana  transcript  31677807    31681733    .   +   .   gene_id "ENSMUSG00000024041"; gene_version "10"; transcript_id "ENSMUST00000228716"; gene_name "Cryaa";
17  havana  exon    31677807    31678189    .   +   .   gene_id "ENSMUSG00000024041"; gene_version "10"; transcript_id "ENSMUST00000228716"; gene_name "Cryaa";
17  havana  CDS 31678001    31678189    .   +   0   gene_id "ENSMUSG00000024041"; gene_version "10"; transcript_id "ENSMUST00000228716"; gene_name "Cryaa";
17  havana  start_codon 31678001    31678003    .   +   0   gene_id "ENSMUSG00000024041"; gene_version "10"; transcript_id "ENSMUST00000228716"; gene_name "Cryaa";
17  havana  exon    31679559    31679681    .   +   .   gene_id "ENSMUSG00000024041"; gene_version "10"; transcript_id "ENSMUST00000228716"; gene_name "Cryaa";

处理脚本:

#!/bin/bash
#SBATCH --job-name=make_rseqc_bed
#SBATCH --mem=32000
#SBATCH --ntasks=4

TARGETS=/work/abf/MouseEnsembl100/gene_names.txt
TGTLABL=gene_name
GTFPATH=/work/abf/MouseEnsembl100/example.gtf

if [ ! -z $TGTLABL ] && [ ! -z $TARGETS ]
then
    gawk -v lbl=${TGTLABL}\
     -v FS="\t| |;"\
     -v OFS=''\
     -v ORS=''\
     '(NR == FNR) {tgt[$1]; next}
      (NR != FNR) {gsub("; ",";")}
          (NR != FNR)\
              {
                 for(i=0; i<=NF; i++){                     
                     if($i == lbl){
                         gsub("\042","",$(i+1))
                         if($(i+1) in tgt){
                             $(i+1)="\042"$(i+1)"\042"
                             for(j=1; j<=NF;j++){
                                if(j < 9) {
                                    printf($j"\t")
                                }
                                else if( (j % 2) == 1){
                                    printf($j" ")
                                }
                                else if( (j % 2) == 0 && (j+1) < NF){
                                    printf($j"; ")
                                }
                                else if((j+1) == NF){
                                    printf($j";LAST_FIELD")
                                }
                             }
                             printf("%s\n","NEXT LINE")
                         }
                  }   
                 } 
              }' $TARGETS $GTFPATH >> extracted_targets.gtf
fi

示例输出

17  ensembl_havana  gene    31677807    31681733    .   +   .   gene_id "ENSMUSG00000024041"; gene_version "10"; gene_name "Cryaa"; NEXT LINE
17  havana  transcript  31677807    31681733    .   +   .   gene_id "ENSMUSG00000024041"; gene_version "10"; transcript_id "ENSMUST00000228716"; gene_name "Cryaa"; NEXT LINE
17  havana  exon    31677807    31678189    .   +   .   gene_id "ENSMUSG00000024041"; gene_version "10"; transcript_id "ENSMUST00000228716"; gene_name "Cryaa"; NEXT LINE
17  havana  CDS 31678001    31678189    .   +   0   gene_id "ENSMUSG00000024041"; gene_version "10"; transcript_id "ENSMUST00000228716"; gene_name "Cryaa"; NEXT LINE
17  havana  start_codon 31678001    31678003    .   +   0   gene_id "ENSMUSG00000024041"; gene_version "10"; transcript_id "ENSMUST00000228716"; gene_name "Cryaa"; NEXT LINE
17  havana  exon    31679559    31679681    .   +   .   gene_id "ENSMUSG00000024041"; gene_version "10"; transcript_id "ENSMUST00000228716"; gene_name "Cryaa"; NEXT LINE

解决方法

经过数小时的尝试,我终于意识到,使用字段定界符集FS="\t| |;",Gawk为终端;生成了一个空字段(在我的GTF文件中,每行以分号结尾)。

当我改变时:

for(j=1; j<=NF;j++){

收件人:

  for(j=1; j<NF;j++){

问题已解决。希望有人觉得这篇文章有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。