如何解决为什么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
(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 举报,一经查实,本站将立刻删除。