gpt4 book ai didi

python - 在 awk 中解析数据

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:46 25 4
gpt4 key购买 nike

我有这样的遗传学数据:

MUT1    G_->_A_(het)    44%_(96)___[45%_(49)_/_43%_(47)]    rs1799967_(Gene_file;_1000Genomes;_ClinVarVCF;_dbSNP,MutDB) c.4956G>A   1
MUT1 A_->_G_(homo) 99%_(297)___[99%_(151)_/_99%_(146)] rs206075_(Gene_file;_1000Genomes;_ClinVarVCF;_dbSNP) c.4563A>G 1
MUT1 G_->_C_(homo) 100%_(259)___[100%_(132)_/_100%_(127)] COSM4147689_(COSMIC),_COSM4147690_(COSMIC),_rs206076_(Gene_file;_1000Genomes;_ClinVar;_ClinVarVCF;_dbSNP) c.6513G>C 2
MUT1 A_->_C_(het) 41%_(103)___[42%_(53)_/_40%_(50)] COSM3753646_(COSMIC),_COSM147663_(COSMIC),_rs144848_(Gene_file;_1000Genomes;_ClinVarVCF;_dbSNP,MutDB) c.1114A>C 5

我需要解析这些数据并仅提取某种字段。

要求输出为:

MUT1    het 44% rs1799967 c.4956G>A 1
MUT1 homo 99% rs206075c.4563A>G 1
MUT1 homo 100% rs206076 c.6513G>C 2
MUT1 het 41% rs144848 c.1114A>C 5

所以输出应该是-所有第一列,第二列只有het或hom,第三列只有%,第五列应该仅提取 rs_number - 这始终具有不同的位置和最后一列。

注意:我知道,关于 homo/het 的信息总是在第二列的最后一个字段中。 % 总是在第三列的第一个字段上。

我的解决方案是:

awk -v OFS="\t" '{print $1,$5,$6,$9,$10,$11}' zkouska.csv | awk -v OFS="\t" 'NR>1{split($2,arr2,"_"); split($3,arr3,"_"); print $1,arr2[4],arr3[1],$4,$5,$6}' 

但是输出是:

BRCA1   (het)   44% rs1799967_(Gene_file;_1000Genomes;_ClinVarVCF;_dbSNP,MutDB) c.4956G>A   1
BRCA1 (homo) 99% rs206075_(Gene_file;_1000Genomes;_ClinVarVCF;_dbSNP) c.4563A>G 1
BRCA1 (homo) 100% COSM4147689_(COSMIC),_COSM4147690_(COSMIC),_rs206076_(Gene_file;_1000Genomes;_ClinVar;_ClinVarVCF;_dbSNP) c.6513G>C 2
BRCA1 (het) 41% COSM3753646_(COSMIC),_COSM147663_(COSMIC),_rs144848_(Gene_file;_1000Genomes;_ClinVarVCF;_dbSNP,MutDB) c.1114A>C 5
BRCA1 (homo) 100% COSM148277_(COSMIC),_COSM3755561_(COSMIC),_rs16942_(Gene_file;_1000Genomes;_ClinVarVCF;_dbSNP) c.3548A>G 5

从第五列中提取 rs 仍然有问题。删除第二个字段中的引号。输入和输出应该用 TAB 分开。 解决方案不能只用 awk。

最佳答案

$ perl -lne 'print join "\t", /^(\S+)/,/^[^(]+\(\K([^)]+)/,/^[^)]+\)\s+\K(\d+%)/,/(rs\d+)/,/(\S+\s+\S+)\s*$/' file
MUT1 het 44% rs1799967 c.4956G>A 1
MUT1 homo 99% rs206075 c.4563A>G 1
MUT1 homo 100% rs206076 c.6513G>C 2
MUT1 het 41% rs144848 c.1114A>C 5
  • /^(\S+)/ 从行首提取非空白字符
  • /^[^(]+\(\K([^)]+)/ 提取第一个 ()
  • 之间的字符
  • /^[^)]+\)\s+\K(\d+%)/ 提取行中第一个匹配的数字后跟 % after first )
  • /(rs\d+)/ 提取 rs 后跟数字
  • /(\S+\s+\S+)\s*$/ 提取最后两列


另一种方式是分别处理每个字段,类似于bashawk方案

$ perl -lane '
$F[1] =~ s/.*\(|\)//g;
$F[2] =~ s/_.*//;
($F[3]) = $F[3] =~ m/(rs\d+)/;
print join "\t", @F;
' file
MUT1 het 44% rs1799967 c.4956G>A 1
MUT1 homo 99% rs206075 c.4563A>G 1
MUT1 homo 100% rs206076 c.6513G>C 2
MUT1 het 41% rs144848 c.1114A>C 5

关于python - 在 awk 中解析数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40759296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com