我有一个大约 13K 行的文件,包含两列。我想提取 中的值'phNAME': 'value'
,但每一行可能有多个phNAME
.
phNAME
如果一行上有多个,我想每一个都写phNAME
,我想将每个值写入单独的行(请参阅输入和输出示例)。
以下是输入文件的示例:
ENSG00000268674 "[{'rgID': 'AMBN10042640', 'probeID': '246945', 'phenodata': [{'phcluster': '7', 'howgood': '1', 'bestgenes': '539', 'ScrID': 'M1_SyM_1', 'phenotypes': [{'ScrID': 'M1_SyM_1', 'phNAME': 'Dynamic changes', 'phID': 7, 'phWEIGHT': 1}]}], 'goodmatch': 0}, {'probeID': '249958', 'rgID': 'AMBN10047320', 'goodmatch': 0, 'phenodata': [{'phenotypes': [{'ScrID': 'E1_SyM_1', 'phWEIGHT': 1, 'phID': 2, 'phNAME': 'Strong inhibition of secretion'}], 'ScrID': 'E1_SyM_1', 'phcluster': '2', 'howgood': '1', 'bestgenes': '1378'}]}]"
ENSG00000215268 "[{'probeID': '105114', 'rgID': 'AMBN10004073', 'goodmatch': 0, 'phenodata': [{'howgood': '0.5', 'phcluster': '7', 'bestgenes': '539', 'phenotypes': [{'ScrID': 'M1_SyM_1', 'phNAME': 'Dynamic changes', 'phID': 7, 'phWEIGHT': 0.5}], 'ScrID': 'M1_SyM_1'}]}]"
ENSG00000130538 "[{'rgID': 'AMBN10042690', 'probeID': '247755', 'phenodata': [{'phenotypes': [{'phNAME': 'Intracellular retention of SH4(YES)-mCherry', 'phID': 2, 'phWEIGHT': 0.5, 'ScrID': 'B1_SyM_1'}], 'ScrID': 'B1_SyM_1', 'bestgenes': '984', 'howgood': '0.5', 'phcluster': '2'}], 'goodmatch': 0}]"
我想要的输出如下所示:
ENSG00000268674 Dynamic changes
ENSG00000268674 Strong inhibition of secretion
ENSG00000215268 Dynamic changes
ENSG00000130538 Intracellular retention of SH4(YES)-mCherry
答案1
解决方案:
perl -lane 'print "$F[0] $_" for /'\''phNAME'\'': '\''([^'\'']+)/g' input.txt
输出:(基于您发布的输入文件)
ENSG00000268674 Dynamic changes
ENSG00000268674 Strong inhibition of secretion
ENSG00000215268 Dynamic changes
ENSG00000130538 Intracellular retention of SH4(YES)-mCherry
解释:
将根据要求提供详细说明。
根据我的经验,perl
它通常是完成此类任务的最合适的工具。
代码看起来相当混乱,因为'\''
, 这只是一个转义的'
.
推荐:
如果可以的话,请避免弄乱json
数据并使用 解析它jq
,正如已经明智地建议的那样。
答案2
这似乎可以解决问题:
$ sed -E 's/^([A-Z0-9]*) .*(phNAME)'"'"': '"'"'([^'"'"']*).*/\1 \3/' input
ENSG00000268674 Strong inhibition of secretion
ENSG00000215268 Dynamic changes
ENSG00000130538 Intracellular retention of SH4(YES)-mCherry
答案3
如果您始终具有相同的格式并且只想提取这个单个值,那么其他解决方案就可以了。
如果您还需要更灵活地获取其他数据,则应该使用json
数据的格式。
Python解决方案:
import csv, demjson
with open('test') as csvfile:
reader = csv.reader(csvfile, delimiter=' ', quotechar='"')
for row in reader:
data = demjson.decode(row[1])
for d in data:
for pd in d['phenodata']:
for pt in pd['phenotypes']:
phname = pt['phNAME']
print('%s %s' % (row[0],phname))
输出:
ENSG00000268674 Dynamic changes
ENSG00000268674 Strong inhibition of secretion
ENSG00000215268 Dynamic changes
ENSG00000130538 Intracellular retention of SH4(YES)-mCherry
由于您的json
字符串无效,我们无法使用该json
模块。
您需要demjson
安装模块:
# python3:
pip3 install demjson
# python2:
pip install demjson