$ seq 9 | sed -n 'p;n;h;n;G;p'
1
3
2
4
6
5
7
9
8
Es decir, p
imprima la línea actual, obtenga el n
ext uno, h
viejo, obtén el n
ext uno, G
et la línea sostenida (agréguela al espacio del patrón) y p
imprime ese espacio de patrón de 2 líneas con la tercera y la segunda línea intercambiadas.
Usando awk
y matemáticas enteras:
awk 'NR%3 == 1 { print } NR%3 == 2 { delay=$0 } NR%3 == 0 { print; print delay; delay=""} END { if(length(delay) != 0 ) { print delay } }' /path/to/input
El operador de módulo realiza la división de enteros y devuelve el resto, por lo que para cada línea devolverá la secuencia 1, 2, 0, 1, 2, 0 [...]. Sabiendo eso, simplemente guardamos la entrada en las líneas donde el módulo es 2 para más tarde, es decir, justo después de imprimir la entrada cuando es cero.
Otro wow enfoque:
awk '{print $0; if ((getline L2)>0 && (getline L3)>0){ print L3 ORS L2 }}' file
La salida:
gi_1234
I have a cat.
My cat is blue.
gi_5678
I also have a dog.
My dog is orange.
-
(getline L2)>0 && (getline L3)>0
- extrae el siguiente 2 registros si existen -
cada segundo y tercer registro se asignan a
L2
yL3
variables respectivamente