Analisar / Manipular no awk

1

Eu sou novo em awk programming. Eu tenho uma pergunta sobre como manipular o arquivo de texto, que é necessário para desenhar certas imagens baseadas em rede em um software de visualização (Circos link )

Eu tenho dados de entrada para os quais quero manipular valores usando awk/grep/sed . Existem 9 pares (18 linhas). 5 pares (primeiras 10 linhas) são para "from = ABCB11" e 4 pares (próximas 8 linhas) são para "from = ABCC8". O que eu quero é extrair o valor da primeira linha do primeiro par e substituí-lo em cada linha alternativa do resto dos outros pares. Portanto, o valor para o grupo 2 é 9 10, o que deve substituir toda a ocorrência de valor no grupo2. O próximo valor para o grupo 2 é 28 29, que deve ser substituído por 9 10.

A parada deve ser determinada por "from = name", que é "from = ABCB11". Não é necessário que as linhas que tiveram que capturar a expressão de e substituir em sua próxima ocorrência pertencerão ao grupo-2 como nesta instância. Poderia ser grupo-3 ou grupo-4 até o grupo-10. Então o segundo set ("from = ABCC8") poderia ter pertencido ao grupo-4/5/6 não necessário no grupo-2. É apenas uma coincidência aqui, mas todos os números do grupo serão os mesmos para cada linha alternativa "from=".

group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-3 0 1 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-2 28 29 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM1,toid=114,use=1,z=1
group-5 0 1 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM1,toid=114,use=1,z=1
group-2 29 30 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM2,toid=115,use=1,z=1
group-5 1 2 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM2,toid=115,use=1,z=1
group-2 10 11 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=DRD2,toid=158,use=1,z=1
group-3 1 2 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=DRD2,toid=158,use=1,z=1
group-2 11 12 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=EGF,toid=164,use=1,z=1
group-3 2 3 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=EGF,toid=164,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-3 12 13 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-2 0 1 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1A,toid=21,use=1,z=1
group-1 0 1 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1A,toid=21,use=1,z=1
group-2 1 2 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1B,toid=22,use=1,z=1
group-1 1 2 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1B,toid=22,use=1,z=1
group-2 2 3 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1D,toid=23,use=1,z=1
group-1 2 3 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1D,toid=23,use=1,z=1

Abaixo está a saída FINAL, estou procurando:

group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-3 0 1 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM1,toid=114,use=1,z=1
group-5 0 1 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM1,toid=114,use=1,z=1
group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM2,toid=115,use=1,z=1
group-5 1 2 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM2,toid=115,use=1,z=1
group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=DRD2,toid=158,use=1,z=1
group-3 1 2 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=DRD2,toid=158,use=1,z=1
group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=EGF,toid=164,use=1,z=1
group-3 2 3 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=EGF,toid=164,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-3 12 13 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1A,toid=21,use=1,z=1
group-1 0 1 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1A,toid=21,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1B,toid=22,use=1,z=1
group-1 1 2 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1B,toid=22,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1D,toid=23,use=1,z=1
group-1 2 3 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1D,toid=23,use=1,z=1

Além disso, isso é apenas um exemplo de dados. Tantos pares teriam o grupo 1, grupo 4, grupo 5 até o grupo 10. Aqui, apenas pares de grupos menores são mencionados.

Basicamente, estas são as modificações que devem ser vistas durante a impressão de linhas completas, até que "from = ABCB11" termine, em cada linha alternativa. Similarmente para "from = ABCC8".

group-2 9 10
group-3 0 1
group-2 9 10
group-5 0 1
group-2 9 10
.........
.........
.........

Aqui está o que eu tentei:

Eu quero percorrer as linhas até que o valor em "from = name" permaneça o mesmo, para que eu possa alterar todas as ocorrências em cada linha alternativa.Code:

awk -F, 'NR%2==1 {split($2,a,"="); print a[2]}' file.txt

O código acima é capaz de extrair as linhas alternativas e o "nome" em "from = name".

    
por Ron 01.05.2014 / 02:33

1 resposta

5

Tente algo como:

awk 'NR%2{if(p!=$2){v=$1; p=$2}$1=v}1' FS=, OFS=, file

Isso testa se $2 foi alterado e substitui $1 em cada linha ímpar com o mesmo valor para cada $2

Adicionada uma explicação ..

awk '
  NR%2 {            # On every line where NR (recordnr) mod 2 equals 1 (odd line)
    if(p!=$2) {     # If the variable p (previous) is different from the 2nd field then
      v=$1          # The new value v should become $1 (1st field)
      p=$2          # The new variable p becomes the current field 2
    }               #
    $1=v            # On every odd line field 1 becomes the previously set value
  }
  1                 # 1 means true. The default action is to print the record (line)
' FS=, OFS=, file   # Set the input and output field separators to a comma.
    
por 01.05.2014 / 11:25