약 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