열의 각 행에서 특정 콘텐츠를 추출합니다.

열의 각 행에서 특정 콘텐츠를 추출합니다.

약 13K 행과 2개의 열이 있는 파일이 있습니다. 의 값을 추출하고 싶지만 '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데이터 형식을 사용해야 합니다.


파이썬 솔루션:

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

관련 정보