$ seq 9 | sed -n 'p;n;h;n;G;p'
1
3
2
4
6
5
7
9
8
C'est-à-dire p
imprimer la ligne courante, obtenir le n
poste un, h
vieux, obtenez le n
poste un, G
et la ligne tenue (ajoutez-la à l'espace du motif) et p
imprimez cet espace de modèle de 2 lignes avec les troisième et deuxième lignes permutées.
Utilisation de awk
et les nombres entiers :
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'opérateur de module effectue une division entière et renvoie le reste, donc pour chaque ligne, il renverra la séquence 1, 2, 0, 1, 2, 0 [...]. Sachant cela, nous enregistrons simplement l'entrée sur les lignes où le module est 2 pour plus tard - à savoir, juste après avoir imprimé l'entrée lorsqu'elle est à zéro.
Un autre maladroit approche :
awk '{print $0; if ((getline L2)>0 && (getline L3)>0){ print L3 ORS L2 }}' file
La sortie :
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
- extraits suivant 2 enregistrements s'ils existent -
chaque 2ème et 3ème enregistrements sont affectés à
L2
etL3
variables respectivement