【发布时间】:2017-04-07 03:46:57
【问题描述】:
我有这样的基因数据:
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好吗?你可以使用perl -ne 'print join "\t", /^(\S+)/,/^[^(]+\(\K([^)]+)/,/^[^)]+\)\s+\K(\d+%)/,/(rs\d+)/,/\S+\s+\S+\s*$/g' file,它看起来很复杂,但只是一堆提取的文本串在一起...... -
文件大小预计会很大吗?近 1000 行,对于此处的字符串操作,
bash可能有方便的技巧,但不适用于更大的文件 -
我认为不会超过 1000 行。当解析需要一段时间时,这不是问题。
-
@Sundeep 感谢您提供 perl 解决方案。我有一个错误无法识别的字符 \xE2;标记为
-
你可以使用
match()函数来查找匹配模式rs[0-9]+的字符串。
标签: python bash parsing awk sed