Bash 使用两个变量(多个值用空格分隔)使用sed更改值

Bash 使用两个变量(多个值用空格分隔)使用sed更改值,bash,awk,sed,Bash,Awk,Sed,首先,我必须说,我尝试了不同的解决方案张贴在这里,但没有人能解决我的问题。抱歉,如果它与另一个类似,但我无法使它工作。我有一个这样的文件: chr17 7579366 COSM45509;COSM11448;COSM45040 G A,C,T 13.2 PASS AF=0.0216216,0,0;AO=4,0,0;DP=185;FAO=4,0,0;FDP=185;FDVR=5,5,5;FR=.,.,.,REALIGNEDx0.03243;FRO=181;FSAF=3,

首先,我必须说,我尝试了不同的解决方案张贴在这里,但没有人能解决我的问题。抱歉,如果它与另一个类似,但我无法使它工作。我有一个这样的文件:

chr17   7579366 COSM45509;COSM11448;COSM45040   G   A,C,T   13.2    PASS    AF=0.0216216,0,0;AO=4,0,0;DP=185;FAO=4,0,0;FDP=185;FDVR=5,5,5;FR=.,.,.,REALIGNEDx0.03243;FRO=181;FSAF=3,0,0;FSAR=1,0,0;FSRF=136;FSRR=45;FUNC=[{'origPos':'7579366','origRef':'G','normalizedRef':'G','gene':'TP53','normalizedPos':'7579366','normalizedAlt':'A','gt':'pos','codon':'TAT','coding':'c.321C>T','transcript':'NM_000546.5','function':'synonymous','protein':'p.(=)','location':'exonic','origAlt':'A','exon':'4','CLNACC1':'RCV000220860','CLNSIG1':'Likely_benign','CLNREVSTAT1':'single','CLNID1':'rs770776262'}];FWDB=0.0168253,-0.0508378,0.0146373;FXX=0;HRUN=1,1,1;HS;HS_ONLY=0;LEN=1,1,1;MLLD=80.6954,128.354,137.413;OALT=A,C,T;OID=COSM45509,COSM11448,COSM45040;OMAPALT=A,C,T;OPOS=7579366,7579366,7579366;OREF=G,G,G;PB=.,.,.;PBP=.,.,.;QD=0.285514;RBI=0.0283383,0.0582477,0.0324614;REFB=0.000208231,-0.000390718,-0.000240087;REVB=0.0228028,-0.0284309,-0.028974;RO=181;SAF=3,0,0;SAR=1,0,0;SRF=136;SRR=45;SSEN=0,0,0;SSEP=0,0,0;SSSB=-0.00109306,0,0;STB=0.501796,0.5,0.5;STBP=0.98,1,1;TYPE=snp,snp,snp;VARB=-0.00120684,0,0;AF_gnomAD=0;cosmic_ids=COSM2745025,COSM5055813,COSM2745026,COSM4272039,COSM5055814,COSM5055812,COSM11448,COSM45509,COSM2745027,COSM45040,COSM4487692,COSM4487691,COSM213589,COSM5055811,COSM213590 GT:GQ:DP:FDP:RO:FRO:AO:FAO:AF:SAR:SAF:SRF:SRR:FSAR:FSAF:FSRF:FSRR   0/1:13:185:185:181:181:4:4:0.0216215997934341:1:3:136:45:1:3:136:45
chr18   48575168    COSM14216;COSM25274 T   TA  41.6    PASS    AF=0.0178891;AO=92;DP=3963;FAO=70;FDP=3913;FDVR=0;FR=.;FRO=3843;FSAF=43;FSAR=27;FSRF=2160;FSRR=1683;FUNC=[{'origPos':'48575168','origRef':'T','normalizedRef':'T','gene':'SMAD4','normalizedPos':'48575168','normalizedAlt':'TA','gt':'pos','codon':'ATG','coding':'c.366_367insA','transcript':'NM_005359.5','function':'frameshiftInsertion','protein':'p.Cys123fs','location':'exonic','origAlt':'TA','exon':'3'}];FWDB=0.0820535;FXX=0.0098684;HRUN=4;HS;HS_ONLY=0;LEN=1;MLLD=27.4213;OALT=A,A;OID=COSM14216,COSM25274;OMAPALT=TA,TA;OPOS=48575170,48575173;OREF=-,-;PB=.;PBP=.;QD=0.0425701;RBI=0.0857718;REFB=-0.00250641;REVB=0.0249804;RO=3838;SAF=50;SAR=42;SRF=2167;SRR=1671;SSEN=0;SSEP=0;SSSB=-0.0142007;STB=0.552796;STBP=0.415;TYPE=ins;VARB=0.109082;AF_gnomAD=0 GT:GQ:DP:FDP:RO:FRO:AO:FAO:AF:SAR:SAF:SRF:SRR:FSAR:FSAF:FSRF:FSRR   0/1:41:3963:3913:3838:3843:92:70:0.0178890991955996:42:50:2167:1671:27:43:2160:1683

chr18   48604749    rs377767375;COSM6784692 G   T   617.0   PASS    AF=0.107822;AO=153;DP=1423;FAO=153;FDP=1419;FDVR=5;FR=.,REALIGNEDx0.1326;FRO=1266;FSAF=143;FSAR=10;FSRF=1076;FSRR=190;FUNC=[{'origPos':'48604749','origRef':'G','normalizedRef':'G','gene':'SMAD4','normalizedPos':'48604749','normalizedAlt':'T','polyphen':'0.834','gt':'pos','codon':'TTG','coding':'c.1571G>T','sift':'0.0','grantham':'61.0','transcript':'NM_005359.5','function':'missense','protein':'p.Trp524Leu','location':'exonic','origAlt':'T','exon':'12','CLNACC1':'RCV000021747','CLNSIG1':'Pathogenic','CLNREVSTAT1':'no_criteria','CLNID1':'rs377767375'}];FWDB=0.0098166;FXX=0.0042105;HRUN=2;HS_ONLY=0;LEN=1;MLLD=57.8823;OALT=T;OID=.;OMAPALT=T;OPOS=48604749;OREF=G;PB=.;PBP=.;QD=1.73921;RBI=0.0271184;REFB=-0.00145864;REVB=-0.0252793;RO=1267;SAF=143;SAR=10;SRF=1078;SRR=189;SSEN=0;SSEP=0;SSSB=0.257732;STB=0.701118;STBP=0.001;TYPE=snp;VARB=0.0118254;AF_gnomAD=0;rs_ids=rs377767375;cosmic_ids=COSM6784692   GT:GQ:DP:FDP:RO:FRO:AO:FAO:AF:SAR:SAF:SRF:SRR:FSAR:FSAF:FSRF:FSRR   0/1:616:1423:1419:1267:1266:153:153:0.107822000980377:10:143:1078:189:10:143:1076:190
我得到了两个我想要改变的变量:

A=$(cat file | awk -F '\t' '{print$8}' | awk -F ';' '{print$1}' | awk -F '=' '{print$2}')
B=$(cat file | grep -v "#" | awk -F '\t' '{print$10}' | awk -F ":" '{print$9}'
我的目标是用变量
$B
的相应值更改变量
$A
的每个值。我试图直接执行
sed-I
,但抛出了与variabñe:
sed:-e表达式:unterminated s'命令中的空格相关的错误。我尝试使用
for
循环,但无法摆脱错误。我最后一次尝试是:

length=3
for ((i=0;i<=$length;i++)); do sed -i "s/"${key[$i]}"/"${value[$i]}"/g" file ; done

您可以直接使用
awk
来执行此操作,而无需使用for-loop或其他额外命令

awk -F'[:| ]' '{a=$(NF-8); sub(/=[^;]*/,"="); sub(/^[^=]*=/,"&"a)}1' file
简要说明

  • -F'[:|]'
    :set':'和空格作为字段分隔符
  • a=$(NF-8)
    :提取所需字段进行替换,并将值分配给“a”
  • sub(/=[^;]*/,“=”)
    :过滤掉第一个“=”和“;”之间的值
  • sub(/(^[^=]*=)/,“&”a)
    :为“=”后面的a赋值

您可以直接使用
awk
来执行此操作,而无需使用for循环或其他额外命令

awk -F'[:| ]' '{a=$(NF-8); sub(/=[^;]*/,"="); sub(/^[^=]*=/,"&"a)}1' file
简要说明

  • -F'[:|]'
    :set':'和空格作为字段分隔符
  • a=$(NF-8)
    :提取所需字段进行替换,并将值分配给“a”
  • sub(/=[^;]*/,“=”)
    :过滤掉第一个“=”和“;”之间的值
  • sub(/(^[^=]*=)/,“&”a)
    :为“=”后面的a赋值

很好,您已经向我们展示了您尝试过的代码,请在此处向我们展示预期的输出,并提供完整的详细信息,因为不清楚。我添加了所需的输出。希望现在更清楚@RavinderSingh13:)作为第二种方法,我尝试使用嵌套for循环,如下所示:'cat file | awk-F'\t'{print$8}'| awk-F';''中的
for I{print$1}'|awk-F'='{print$2}';在'cat file | grep-v“#”| awk-F'\t'{print$10}'| awk-F中为j执行命令“{print$9}”;do sed-i“s/$j/$i/g”文件;完成;完成
在这种情况下,命令更改所需的值(相当于
$A
变量),但仅使用第二个
for
循环中的最后一个值(与上一示例中的
$B
相同)。我想在这里我应该保持跟踪的立场,但我不知道如何做到这一点。很好,你已经向我们展示了你所尝试的代码,请告诉我们应该是什么样的预期输出在这里也有完整的细节,因为它不清楚。我添加了所需的输出。希望现在更清楚@RavinderSingh13:)作为第二种方法,我尝试使用嵌套for循环,如下所示:'cat file | awk-F'\t'{print$8}'| awk-F';''中的
for I{print$1}'|awk-F'='{print$2}';在'cat file | grep-v“#”| awk-F'\t'{print$10}'| awk-F中为j执行命令“{print$9}”;do sed-i“s/$j/$i/g”文件;完成;完成
在这种情况下,命令更改所需的值(相当于
$A
变量),但仅使用第二个
for
循环中的最后一个值(与上一示例中的
$B
相同)。我想在这里我应该跟踪这个位置,但我不知道怎么做。第二个子()中的(和)没有任何作用,您可以删除它们+感谢有耐心尝试理解问题中的数据!第二个子()中的(和)没有任何作用,您可以将它们删除+感谢有耐心尝试理解问题中的数据!