awk combina com vários padrões e imprime em uma única linha

5

Eu tenho o seguinte arquivo:

$ cat disk.out
disk0
fcs0
text
text
text
disk1
fcs1
text
text
text
text
...

O que eu estou tentando alcançar é combinar "disco" + "fcs" e depois imprimir o par em uma linha, assim:

disk0,fcs0
disk1,fcs1
...

Por isso, estou combinando "disco" e "fcs" com awk e alterando o separador de registro de saída para ",". '

$ awk '/disk|fcs/' ORS="," disk.out
disk0,fcs0,disk1,fcs1,

O problema é que ele imprimirá todas as correspondências em uma linha e com um , à direita. Como posso imprimir apenas por correspondência em uma linha? Assim:

disk0,fcs0
disk1,fcs1
...
    
por fightingurukhai 17.08.2016 / 11:17

3 respostas

7

Você precisa salvar a linha "disk" (sem imprimi-la) até encontrar a próxima linha "fcs":

awk '/disk/{ DISK=$0; next } /fcs/{ print DISK "," $0 }'

O problema com sua abordagem é que ela imprime qualquer linha correspondente a "disco" ou "fcs", sem combinar essas linhas.

Editar: o script da versão é mais robusto, pois ignora

disk3
text
fcs3

Meu script seria feliz para imprimir "disk3, fcs3" neste caso.

    
por 17.08.2016 / 11:30
6
$ awk '/fcs/ && a ~ /disk/ {print a","$0} {a=$0}' disk.out
disk0,fcs0
disk1,fcs1
    
por 17.08.2016 / 11:31
5

Se estiver sempre nesse formato (um fcs para um disco, fcs sempre depois do disco), você poderá fazer isso sem awk :

grep -F -e disk -e fcs file | paste -d , - -

Ou:

awk '(/disk/ && ORS=",") || (/fcs/ && ORS=RS)' file

Embora com awk , você pode preferir uma abordagem mais legível como a dada por Martin ou sp asic.

    
por 17.08.2016 / 11:42