首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换每行中出现的前三次字符

替换每行中出现的前三次字符
EN

Stack Overflow用户
提问于 2018-06-18 07:31:07
回答 6查看 2.3K关注 0票数 2

我有一个带有多个分号分隔标记的INFO列的由制表符分隔的遗传变异文件:

代码语言:javascript
复制
Chr Start   End Ref Alt ExAC_ALL    ExAC_AFR    ExAC_AMR    ExAC_EAS    ExAC_FIN    ExAC_NFE    ExAC_OTH    ExAC_SAS    Otherinfo   QUAL    DP  Chr Start       Ref Alt QUAL    FILTER  INFO
1   15847952    15847952    G   C   .   .   .   .   .   .   .   .   .   241.9   76196   1   15847952    .   G   C   241.9   PASS    AC=2;AF=0;AN=18332;BaseQRankSum=0.731;ClippingRankSum=-0.731;DP=76196;ExcessHet=3.1;FS=0;InbreedingCoeff=-0.0456;MLEAC=2;MLEAF=0;MQ=38.93;MQRankSum=0.515;NEGATIVE_TRAIN_SITE;QD=10.52;ReadPosRankSum=0.89;SOR=0.481;VQSLOD=-1.406        culprit=MQ
1   15847963    15847963    A   C   .   .   .   .   .   .   .   .   .   1607.1  126156  1   15847963    .   A   C   1607.1  PASS    AC=2;AF=0;AN=22004;BaseQRankSum=0.851;ClippingRankSum=-0.419;DP=126156;ExcessHet=3.4904;FS=0;InbreedingCoeff=0.0299;MLEAC=2;MLEAF=0;MQ=59.29;MQRankSum=0.18;QD=1.55;ReadPosRankSum=0.067;SOR=0.651;VQSLOD=0.995        culprit=QD
1   15847964    15847966    GCC -   .   .   .   .   .   .   .   .   .   1607.1  126156  1   15847963    .   AGCC    A   1607.1  PASS    AC=63;AF=0.003;AN=22004;BaseQRankSum=0.851;ClippingRankSum=-0.419;DP=126156;ExcessHet=3.4904;FS=0;InbreedingCoeff=0.0299;MLEAC=55;MLEAF=0.002;MQ=59.29;MQRankSum=0.18;QD=1.55;ReadPosRankSum=0.067;SOR=0.651;VQSLOD=0.995        culprit=QD
1   15847978    15847978    C   T   .   .   .   .   .   .   .   .   .   648.41  234344  1   15847978    .   C   T   648.41  PASS    AC=9;AF=0;AN=25894;BaseQRankSum=-0.572;ClippingRankSum=-0.404;DP=234344;ExcessHet=3.348;FS=2.639;InbreedingCoeff=-0.0098;MLEAC=6;MLEAF=0;MQ=58.71;MQRankSum=-0.456;NEGATIVE_TRAIN_SITE;QD=4.13;ReadPosRankSum=-0.456;SOR=0.452;VQSLOD=-1.238        culprit=QD

我想在INFO列中拆分前3个分号分隔的术语:

代码语言:javascript
复制
AC=2;AF=0;AN=18332

使它们成为:

代码语言:javascript
复制
AC=2    AF=0    AN=18332    BaseQRankSum=0.731;ClippingRankSum=-0.731;DP=76196;ExcessHet=3.1;FS=0;InbreedingCoeff=-0.0456;MLEAC=2;MLEAF=0;MQ=38.93;MQRankSum=0.515;NEGATIVE_TRAIN_SITE;QD=10.52;ReadPosRankSum=0.89;SOR=0.481;VQSLOD=-1.406        culprit=M

到目前为止,我已经用sed尝试了下面的表达式

代码语言:javascript
复制
sed -i .bk 's/\(A.=.*\);/\1        /g' allChr_ExAC38.hg38_multianno.txt

但这不会产生任何变化。

理想情况下,我正在寻找一种方法来告诉sed将分号;的前3次出现替换为tab,但's/;/ /g3'似乎并不是这个意思。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2018-06-18 07:44:03

使用Perl而不是sed:

代码语言:javascript
复制
perl -i.bk -pe '$c = 0; s/;/\t/ while $c++ < 3' -- file.txt
票数 6
EN

Stack Overflow用户

发布于 2018-06-18 08:08:01

你可以试试这个

代码语言:javascript
复制
awk '{for(i=1;i<4;i++)sub(";","\t")}1' infile
票数 1
EN

Stack Overflow用户

发布于 2018-06-18 07:42:49

请你试着跟我说一下,如果这对你有帮助的话,请告诉我。

代码语言:javascript
复制
awk '
FNR==1{
  print;
  next}
{
  num=split($(NF-1),array,";");
  for(i=4;i<=num;i++){
    val=val?val ";"array[i]:array[i]};
    $(NF-1)=array[1] OFS array[2] OFS array[3] OFS val;
    val="";
    $1=$1
}
1
' OFS="\t"  Input_file
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50904588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档