用变量的内容替换列的内容

时间:2019-06-06 10:56:33

标签: bash awk grep

我的最终目标是,将GQPDOMB_impute_copie.vcf文件的每一行的info列(GQPDOMB_impute_copie.vcf文件的第8列)替换为formatting.txt文件的第2列和第3列的内容:

那是我的主意:

For each line of the GQPDOMB_impute_copie.vcf file
do 
    the variable rs retrieves the rsID of the current line in column 3 of the GQPDOMB_impute_copie.vcf file
    The variable VAR1 searches for the content of the variable rs in the formatting.txt file for each line
    if the variable is not empty (the content of rs for this line has been found in the formatting.txt file)
    so
        the ra variable recovers the contents of columns 2 and 3 of the formatting.txt file
        The content of column 8 of the current row is replaced by the content of the variable ra (which contains the information contained in columns 2 and 3 of formatting.txt)
    fi
done

GQPDOMB_impute_copie.vcf:

##fileformat=VCFv4.3
1   783071  rs142849724 C   T   .   PASS    TYPED;RefPanelAF=0.018571;AN=80;AC=5;INFO=1 GT  0|0 0|0 1|0 0|0 1|0 0|0 0|0 0|0 0|0 0|1 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|1 0|0 0|0 0|0 0|1 0|0 0|0 0|0
1   783186  rs141989890 G   C   .   PASS    RefPanelAF=0.000323375;AN=80;AC=0;INFO=1    GT  0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0
1   783632  rs193023236 G   A   .   PASS    RefPanelAF=0.00040037;AN=80;AC=0;INFO=1 GT  0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0

formating.txt:

rs142849724;ENSG00000228794;ENST00000624927|ENST00000623808|ENST00000445118|ENST00000448975|ENST00000610067|ENST00000608189|ENST00000609139|ENST00000449005|ENST00000416570|ENST00000623070|ENST00000609009|ENST00000622921
rs141989890;ENSG00000228794;ENST00000624927|ENST00000623808|ENST00000445118|ENST00000448975|ENST00000610067|ENST00000608189|ENST00000609139|ENST00000449005|ENST00000416570|ENST00000623070|ENST00000609009|ENST00000622921
rs193023236;ENSG00000228794;ENST00000624927|ENST00000623808|ENST00000445118|ENST00000448975|ENST00000610067|ENST00000608189|ENST00000609139|ENST00000449005|ENST00000416570|ENST00000623070|ENST00000609009|ENST00000622921

经过互联网上的大量研究,以下是我可以为您提供的代码:

#!/bin/bash

while read line
do
   rs=$(awk -F '\t' '{print $3}' GQPDOMB_impute_copie.vcf)     #recovery rsID
   VAR1=$(grep "${rs}" formating.txt)      #we check if the rsID of the current line is found in the file formatting.txt
   if [ -n "$VAR1" ] ;     #if the rsID of the current line has been found
   then
       ra=$(grep "${rs}" formating.txt | awk -F ';' '{print $2,";",$3}')   #recovery of the contents of columns 2 and 3 of the formating.txt file in the same vaiable  
       awk -F '\t' -v t="\"$ra\"" '{$8=t; print }' OFS='\t' GQPDOMB_impute_copie.vcf   #replace the content of the column 8 (info) with the content of the prévious var
   fi
done < GQPDOMB_impute_copie.vcf

但是,我认为程序无法逐行读取vcf文件,并且无法成功创建变量VAR1。这是返回给我的错误:

./script-info.sh: line 16: /usr/bin/grep: Argument list too long
./script-info.sh: line 16: /usr/bin/grep: Argument list too long
./script-info.sh: line 16: /usr/bin/grep: Argument list too long

如何成功创建此脚本,并在可能的情况下尽可能高效地完成

谢谢你。

编辑 :如您所愿,这就是我想要恢复输出文件的方式:

##fileformat=VCFv4.3
1   783071  rs142849724 C   T   .   PASS    ENSG00000228794;ENST00000624927|ENST00000623808|ENST00000445118|ENST00000448975|ENST00000610067|ENST00000608189|ENST00000609139|ENST00000449005|ENST00000416570|ENST00000623070|ENST00000609009|ENST00000622921
 GT  0|0 0|0 1|0 0|0 1|0 0|0 0|0 0|0 0|0 0|1 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|1 0|0 0|0 0|0 0|1 0|0 0|0 0|0
1   783186  rs141989890 G   C   .   PASS    ENSG00000228794;ENST00000624927|ENST00000623808|ENST00000445118|ENST00000448975|ENST00000610067|ENST00000608189|ENST00000609139|ENST00000449005|ENST00000416570|ENST00000623070|ENST00000609009|ENST00000622921    GT  0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0
1   783632  rs193023236 G   A   .   PASS    ENSG00000228794;ENST00000624927|ENST00000623808|ENST00000445118|ENST00000448975|ENST00000610067|ENST00000608189|ENST00000609139|ENST00000449005|ENST00000416570|ENST00000623070|ENST00000609009|ENST00000622921 GT  0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0 0|0

1 个答案:

答案 0 :(得分:1)

没有向我们显示预期的输出,我们正在猜测您想要的是什么,但是也许是这样:

$ cat tst.awk
BEGIN   { FS=";" }
NR==FNR { val[$1] = $2 FS $3; next }
FNR==1  { FS=OFS="\t"; $0=$0 }
!/^#/   { $8 = ($3 in val ? val[$3] : $8) }
{ print }

$ awk -f tst.awk formatting.txt GQPDOMB_impute_copie.vcf
##fileformat=VCFv4.3
1       783071  rs142849724     C       T       .       PASS    ENSG00000228794;ENST00000624927|ENST00000623808|ENST00000445118|ENST00000448975|ENST00000610067|ENST00000608189|ENST00000609139|ENST00000449005|ENST00000416570|ENST00000623070|ENST00000609009|ENST00000622921 GT      0|0     0|0     1|0     0|0     1|0     0|0     0|0     0|0     0|0     0|1     0|0     0|00|0      0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|00|0      0|0     0|0     0|0     0|1     0|0     0|0     0|0     0|1     0|0     0|0     0|0
1       783186  rs141989890     G       C       .       PASS    ENSG00000228794;ENST00000624927|ENST00000623808|ENST00000445118|ENST00000448975|ENST00000610067|ENST00000608189|ENST00000609139|ENST00000449005|ENST00000416570|ENST00000623070|ENST00000609009|ENST00000622921 GT      0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|00|0      0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|00|0      0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0
1       783632  rs193023236     G       A       .       PASS    ENSG00000228794;ENST00000624927|ENST00000623808|ENST00000445118|ENST00000448975|ENST00000610067|ENST00000608189|ENST00000609139|ENST00000449005|ENST00000416570|ENST00000623070|ENST00000609009|ENST00000622921 GT      0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|00|0      0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|00|0      0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0     0|0