从列中的每一行中提取特定内容

从列中的每一行中提取特定内容

我有一个大约 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

相关内容