$ seq 9 | sed -n 'p;n;h;n;G;p'
1
3
2
4
6
5
7
9
8
Ovvero, p
stampa la riga corrente, ottieni il n
ext uno, h
vecchio, prendi il n
ext uno, G
et la linea trattenuta (aggiungilo allo spazio del modello) e p
stampa lo spazio del modello a 2 righe con la terza e la seconda riga scambiate.
Usando awk
e numeri interi:
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
L'operatore modulo esegue la divisione intera e restituisce il resto, quindi per ogni riga restituirà la sequenza 1, 2, 0, 1, 2, 0 [...]. Sapendo questo, salviamo l'input sulle righe in cui il modulo è 2 per dopo -- vale a dire, subito dopo aver stampato l'input quando è zero.
Un altro awk approccio:
awk '{print $0; if ((getline L2)>0 && (getline L3)>0){ print L3 ORS L2 }}' file
L'output:
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
- estratti successivi 2 record se esistono -
ogni 2° e 3° record sono assegnati a
L2
eL3
variabili rispettivamente