Extrai informações de um arquivo de texto

3

Eu tenho um arquivo de texto, quero pesquisar tags como as seguintes:

<category="SpecificDisease">Type II human complement C2 deficiency</category>
<category="Modifier">Huntington disease</category>
<category="CompositeMention">hereditary breast and ovarian cancer</category>
<category="DiseaseClass">myopathy</category>

e produza o seguinte e grave-os em um novo arquivo de texto.

Type II human complement C2 deficiency
Huntington disease
hereditary breast and ovarian cancer
myopathy
    
por nlp 06.11.2013 / 19:55

2 respostas

7

Parece um tipo de arquivo de linguagem de marcação XML ou semelhante. Esses arquivos não devem ser analisados por simples expressões regulares por medo de acordar TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚ N̐Y̡ . Você deve usar um analisador específico para essa marcação e sua linguagem de script favorita.

Isso se parece com os dados do OMIM ou do HPO. Nesse caso, você deve conseguir arquivos de texto simples e simplificar as coisas. Se você não puder e realmente precisar analisar esse arquivo, poderá fazer isso em perl:

perl -lne '/<.*?>([^<>]+)/ && print $1' foo.txt

No entanto, isso será interrompido se você tiver várias tags por linha ou se o conteúdo da tag puder se estender por várias linhas ou se os dados da tag puderem conter > ou < . Se todas as suas informações forem sempre entre <category="whatever">blah blah</category> , você poderá obter tudo de forma mais robusta (incluindo conteúdo de várias linhas de linha e incorporado < ou > ):

#!/usr/bin/env perl

## Set the start and end tags
$end="</category>"; 
$start="<category=.*?>"; 

## Read through the file line by line
while(<>){
    ## set $a to one if the current line matches $start
    $a=1 if /$start/; 
    ## If the current line matches $start, capture any relevant content.
    ## I am also removing any $start or $end tags if present.
    if(s/($start)*(.+)($end)*/$2/){
    push @lines,$2 if $a==1;
    }  
    ## If the current line matches $end, capture any relevant content,
    ## print what we have saved so far, set $a back to 0 and empty the
    ## @lines array
    if(/$end/){
    map{s/$end//;}@lines; 
    print "@lines\n";
    @lines=(); 
    $a=0
    }; 
}

Salve este script como foo.pl ou qualquer outro, torne-o executável e execute-o no seu arquivo:

./foo.pl file.txt

Por exemplo:

$ cat file.txt 
<category="SpecificDisease">Type II 
 human complement C2 deficiency</category>
<category="Modifier">Huntington disease</category>
<category="CompositeMention">hereditary breast < and ovarian cancer</category>
<category="DiseaseClass">myopathy > cardiopathy</category>

$ ./foo.pl file.txt 
Type II   human complement C2 deficiency
Huntington disease
hereditary breast < and ovarian cancer
myopathy > cardiopathy

Mais uma vez, eu enfatizo que se (o que é muito provável) seu arquivo é mais complexo que o exemplo acima, isso falhará e métodos mais sofisticados serão necessários.

    
por 06.11.2013 / 20:14
4

Você pode fazer isso simplesmente em sed :

sed 's/>\([^>]\+\)<//' your_file > new_file

para extrair o texto entre > e < em cada linha. Isso pressupõe que você tenha uma tag por linha.

    
por 06.11.2013 / 20:12