Extrai coisa específica de cada linha na coluna

0

Eu tenho um arquivo com ~ 13K linhas, contendo duas colunas. Eu quero extrair os valores em 'phNAME': 'value' , mas cada linha pode ter mais de um phNAME .

Caso haja mais de um phNAME em uma única linha, quero gravar cada valor phNAME em uma linha separada (ver amostras de entrada e saída) .

Aqui está uma amostra do arquivo de entrada:

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}]"

Minha saída desejada é assim:

ENSG00000268674 Dynamic changes
ENSG00000268674 Strong inhibition of secretion
ENSG00000215268 Dynamic changes
ENSG00000130538 Intracellular retention of SH4(YES)-mCherry
    
por Sara Wasl 23.07.2018 / 16:13

3 respostas

1

Solução:

perl -lane 'print "$F[0] $_" for /'\''phNAME'\'': '\''([^'\'']+)/g' input.txt

Saída: (com base no seu arquivo de entrada publicado)

ENSG00000268674 Dynamic changes
ENSG00000268674 Strong inhibition of secretion
ENSG00000215268 Dynamic changes
ENSG00000130538 Intracellular retention of SH4(YES)-mCherry

Explicação:

Uma explicação detalhada será fornecida mediante solicitação.
Na minha experiência, perl é geralmente a ferramenta mais adequada para esse tipo de tarefa.
O código parece bastante confuso por causa de '\'' , que é simplesmente um escape ' .

Recomendação:

Se puder, evite mexer com json data e analise-o com jq , como já sugeriu sensatamente.

    
por 24.07.2018 / 10:22
0

Isso parece fazer o truque:

$ sed -E 's/^([A-Z0-9]*) .*(phNAME)'"'"': '"'"'([^'"'"']*).*/ /' input
ENSG00000268674 Strong inhibition of secretion
ENSG00000215268 Dynamic changes
ENSG00000130538 Intracellular retention of SH4(YES)-mCherry
    
por 23.07.2018 / 17:08
0

As outras soluções são boas se você sempre tiver o mesmo formato e quiser extrair apenas esse valor único.

Se você precisar de mais flexibilidade para obter outros dados também, use o formato json dos dados.

Solução 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))

Saída:

ENSG00000268674 Dynamic changes
ENSG00000268674 Strong inhibition of secretion
ENSG00000215268 Dynamic changes
ENSG00000130538 Intracellular retention of SH4(YES)-mCherry

Como sua string json não é válida, não podemos usar o módulo json .
Você precisa ter o módulo demjson instalado:

# python3:
pip3 install demjson
# python2:
pip install demjson
    
por 24.07.2018 / 10:57