Copie parte do conteúdo da linha anterior para o seguinte

1

Eu tenho um arquivo com a seguinte estrutura:

GO:0000001      mitochondrion inheritance
GO:0000002      mitochondrial genome maintenance
GO:0000003      reproduction
alt_id: GO:0019952
alt_id: GO:0050876
GO:0000005      obsolete ribosomal chaperone activity
GO:0000006      high-affinity zinc uptake transmembrane transporter activity
GO:0000007      low-affinity zinc ion transmembrane transporter activity
GO:0000008      obsolete thioredoxin
alt_id: GO:0000013
GO:0000009      alpha-1,6-mannosyltransferase activity

Onde diz alt_id , significa que é uma alternativa ao código GO: anterior. Eu gostaria de adicionar a cada alt_id a definição do GO: anterior, ou seja, eu quero uma saída como esta:

GO:0000001      mitochondrion inheritance
GO:0000002      mitochondrial genome maintenance
GO:0000003      reproduction
alt_id: GO:0019952     reproduction
alt_id: GO:0050876     reproduction
GO:0000005      obsolete ribosomal chaperone activity
GO:0000006      high-affinity zinc uptake transmembrane transporter activity
GO:0000007      low-affinity zinc ion transmembrane transporter activity
GO:0000008      obsolete thioredoxin
alt_id: GO:0000013      obsolete thioredoxin
GO:0000009      alpha-1,6-mannosyltransferase activity

Como posso copiar o conteúdo da linha anterior da seguinte maneira? Eu trabalho com o Cygwin em um ambiente baseado no Windows.

    
por LinuxBlanket 25.10.2016 / 13:10

2 respostas

2

Com awk , não tenho certeza se funcionará em Cygwin

$ awk '{ if(/^alt_id/){$0 = $0" "p} else{p = ""; for (i=2; i<=NF; i++) p = p" "$i} } 1' ip.txt
GO:0000001      mitochondrion inheritance
GO:0000002      mitochondrial genome maintenance
GO:0000003      reproduction
alt_id: GO:0019952  reproduction
alt_id: GO:0050876  reproduction
GO:0000005      obsolete ribosomal chaperone activity
GO:0000006      high-affinity zinc uptake transmembrane transporter activity
GO:0000007      low-affinity zinc ion transmembrane transporter activity
GO:0000008      obsolete thioredoxin
alt_id: GO:0000013  obsolete thioredoxin
GO:0000009      alpha-1,6-mannosyltransferase activity
  • Para cada linha que não corresponda a alt_id no início da linha, use uma variável ( p ) para salvar todas as colunas de duas em diante
  • Quando a linha corresponder a alt_id no início da linha, anexe o conteúdo da variável p à linha de entrada contida em $0 variable
  • O% final 1 é atalho para imprimir o conteúdo de $0
por 25.10.2016 / 13:22
2

A tarefa pode ser facilmente executada por sed

sed '
    N  #append next line (operate with 'line1\nline2');
    /\nalt_id/s/\([^0-9]*\)\n.*/&/
       #if next line starts with 'alt_id' the append end of present line
    P  #print present line (all before '\n')
    D  #remove all before '\n', starts from begin with remain part (line2)
    ' file

Outra maneira é usar espaço de espera

sed '
    /^alt_id:/G #if line starts by 'alt_id:' append hold-space
    s/\n//      #remove '\n'ewline symbol
    t           #if removing success pass further commands (go to end)
    h           #if no (for other lines) copy it to hold-space
    s/\S*//     #remove all non-space symbols from start till first space
    x           #exchange hold-space and pattern-space ==
                #+put resedue into hold-space and return full line
    ' file
    
por 25.10.2016 / 13:26