Abordagem simples sed
:
sed -n '/ VALUE1$/{ N; / VALUE2$/p }' xyz.dat > new.txt
new.txt
contents:
3 VALUE1
4 VALUE2
5 VALUE1
6 VALUE2
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
Abordagem simples sed
:
sed -n '/ VALUE1$/{ N; / VALUE2$/p }' xyz.dat > new.txt
new.txt
contents:
3 VALUE1
4 VALUE2
5 VALUE1
6 VALUE2
com sed
sed '/ VALUE1$/!d;N;/ VALUE2$/b;D' infile
Outra abordagem awk
:
awk '/VALUE1/{ bkup=$0 } /VALUE2/ && bkup{print bkup ORS $0; bkup=""}' infile
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
Tags text-processing awk sed