Awk使用命令行参数而不是列名

时间:2015-04-27 17:02:15

标签: bash unix awk bioinformatics samtools

我正在尝试创建一个脚本,从sam文件的标头中删除读取组。从命令行运行的代码如下所示。

samtools view -H e2_20.indel.recal.dedup.bam | awk ' BEGIN {FS = "\t"} {split($2,a,":")} {if ($1 != "@RG" || ($1 =="@RG" && a[2] == "e2_20")) print}' | samtools reheader - e2_20.indel.recal.dedup.bam | samtools view -H -

以下是输入文件的示例

@HD VN:1.4  GO:none SO:coordinate
@SQ SN:chr10 LN:129993255
@SQ SN:chr11 LN:121843856
@RG ID:e2_20 PL:illumina
@RG ID:e2_9 PL:illumina
@PG ID:GATK IndelRealigner

运行上述命令后,输出为

@HD VN:1.4  GO:none SO:coordinate
@SQ SN:chr10 LN:129993255
@SQ SN:chr11 LN:121843856
@RG ID:e2_20 PL:illumina
@PG ID:GATK IndelRealigner.

基本上,我只是删除以“@RG”开头并且不是ID e2_20的行。

问题是如果我在bash脚本中运行它,那么该命令不起作用。

脚本如下。

#!/bin/bash
#$ -j y
#$ -S /bin/bash
#$ -V
#$ -cwd
source /apps1/modules/init/bash
module load samtools/gnu/1.1
input=$1
output=$2
samp=$3
samtools view -H ${input} | awk ' BEGIN {FS = "\t"} {split($2,a,":")} {if ($1 != "@RG" || ($1 =="@RG" && a[2] == "${samp}")) print}' | samtools reheader - ${input} > ${output}
echo "samtools view -H ${input} | awk ' BEGIN {FS = "\t"} {split($2,a,":")} {if ($1 != "@RG" || ($1 =="@RG" && a[2] == "${samp}")) print}' | samtools reheader - ${input} > ${output}"

此脚本在SGE集群中运行,这是脚本顶部奇怪语法的原因。脚本的名称是reHeadBams.bash。我通过输入以下命令在shell上运行脚本:

qsub reHeadBams.bash e2_20.indel.recal.dedup.bam e2_20.prac.indel.recal.dedup.bam e2_20 

命令的参数是输入文件,后跟输出文件,最后是我想要查找的示例或读取组。

脚本的输出如下所示:

@HD VN:1.4  GO:none SO:coordinate
@SQ SN:chr10    LN:129993255
@SQ SN:chr11    LN:121843856
@PG ID:GATK IndelRealigner.

因此脚本删除了所有读取组,而不是ID为e2_9的读取组。

我从脚本回显了命令,输出是

samtools view -H e2_20.indel.recal.dedup.bam | awk ' BEGIN {FS = '\t'} {split(e2_20.prac.indel.recal.dedup.bam,a,:)} {if (e2_20.indel.recal.dedup.bam != '@RG' || (e2_20.indel.recal.dedup.bam =='@RG' && a[2] == 'e2_20')) print}' | samtools reheader - e2_20.indel.recal.dedup.bam > e2_20.prac.indel.recal.dedup.bam

虽然我可能会弄错,但问题似乎是awk使用我的命令行参数而不是输入文件的列为$ 1和$ 2。有谁知道为什么会这样?

很抱歉我的问题长篇大论。如果您需要任何澄清,请告诉我。

1 个答案:

答案 0 :(得分:0)

问题是我需要使用-v参数将变量导入到“samp”变量为awk,如下所示。

纠正之前

samtools view -H ${input} | awk ' BEGIN {FS = "\t"} {split($2,a,":")} {if ($1 != "@RG" || ($1 =="@RG" && a[2] == "${samp}")) print}' | samtools reheader - ${input} > ${output}

更正后

samtools view -H ${input} | awk -v samp="$3" ' BEGIN {FS = "\t"} {split($2,a,":")} {if ($1 != "@RG" || ($1 =="@RG" && a[2] == samp)) print}' | samtools reheader - ${input} > ${output}