Imprimir ambas as linhas se a coluna mudar

2

Eu vi essa pergunta e quero fazer algo semelhante: Imprimir linha se o valor na coluna mudar

Essencialmente, terei um arquivo (delimitado por tabulação) como este

A 0 10 loss
A 10 20 loss
A 20 30 loss
A 30 40 no
A 40 50 no
A 50 60 no
A 60 70 no
A 70 80 gain
...

e eu quero imprimir ambas as linhas onde a coluna 4 muda de (por exemplo) "perda" - > "não" ou "não" - > "ganho", então a saída seria

A 20 30 loss
A 30 40 no
A 60 70 no
A 70 80 gain

O valor na coluna 4 pode ser qualquer coisa, mas eu quero imprimir as duas linhas colocando o valor da alteração.

Isso parece algo que eu poderia fazer com o awk, mas não estou muito familiarizado com isso.

    
por user36196 02.09.2018 / 19:03

3 respostas

2

Com awk , você poderia fazer:

awk 'BEGIN  { getline; cmp=$4; preline=$0 }
     cmp!=$4{ print preline, $0 } { cmp=$4; preline=$0 }' OFS='\n'  infile
A 20 30 loss
A 30 40 no
A 60 70 no
A 70 80 gain

No bloco BEGIN , lemos a primeira linha e salvamos a coluna # 4 na variável chamada cmp e a linha inteira em preline ; mais tarde, compare a coluna 4 da linha anterior com a linha atual, se houver alterações, imprima o valor preline e a linha atual leia $0 ; o próximo bloco é apenas atualizar a coluna4 da linha atual e a linha inteira novamente como linha anterior para a próxima execução.

    
por 02.09.2018 / 19:19
1

Usando o editor sed da variedade GNU , podemos fazer da seguinte maneira:

sed -Ee '
    $d;N
    /\s(\S+)\n.*\s$/!p
    D
' input.file

Nós carregamos duas linhas no espaço padrão em todos os momentos, N e procuramos a transição do último campo. Assim que detectamos um, /\s(\S+)\n.*\s$/!p , imprimimos todo o espaço do padrão. Em seguida, excluímos a primeira parte, D do espaço de padrão nos cenários de transição ou sem transição, uma vez que o uso da primeira parte acabou nesse estágio.

O controle é transferido para o topo do código sed e, caso ainda não tenhamos chegado ao fim, repetimos esse procedimento novamente. Eof interrompe a operação, $d .

Saída:

A 20 30 loss
A 30 40 no
A 60 70 no
A 70 80 gain
    
por 02.09.2018 / 19:57
1

Por que não:

$ awk '(NR > 1) && (LAST !~ $4 "$") {print LAST; print $0} {LAST = $0}' file
A 20 30 loss
A 30 40 no
A 60 70 no
A 70 80 gain
    
por 02.09.2018 / 23:11