imprime para o arquivo somente quando um valor em uma linha é imediatamente seguido por outro valor bash

0

Eu tenho um arquivo (xyz.dat) que contém todos os tipos de instruções aleatórias. O que preciso fazer é pesquisar este arquivo por VALUE1 em uma linha e só imprimir no arquivo quando VALUE1 for imediatamente seguido em uma nova linha por VALUE2 .

Exemplo de entrada:

1 VALUE1
2 VALUE1
3 VALUE1
4 VALUE2
5 VALUE1
6 VALUE2
7 VALUE2

Resultado esperado:

3 VALUE1
4 VALUE2
5 VALUE1
6 VALUE2
    
por SSDdude 24.05.2018 / 18:04

4 respostas

1

Abordagem simples sed :

sed -n '/ VALUE1$/{ N; / VALUE2$/p }' xyz.dat > new.txt

new.txt contents:

3 VALUE1
4 VALUE2
5 VALUE1
6 VALUE2
    
por 24.05.2018 / 18:17
1

com sed

sed '/ VALUE1$/!d;N;/ VALUE2$/b;D' infile
    
por 24.05.2018 / 19:32
0

Outra abordagem awk :

awk '/VALUE1/{ bkup=$0 } /VALUE2/ && bkup{print bkup ORS $0; bkup=""}' infile
    
por 24.05.2018 / 18:20
0

Duas soluções Awk :

- com base na função getline :

awk '/ VALUE1$/ && (getline nl) > 0 && nl ~ /VALUE2$/{ print $0 ORS nl }' xyz.dat

- com base na comparação do número de registros:

awk '/ VALUE1$/{ rec = $0; rn = NR+1 }NR == rn && /VALUE2$/{ print rec ORS $0 }' xyz.dat

A saída (para ambos):

3 VALUE1
4 VALUE2
5 VALUE1
6 VALUE2
    
por 24.05.2018 / 18:21