2
votes

Déplacer chaque première ligne vers la deuxième ligne

J'ai l'exemple de texte suivant:

x_y_ a b c
x_y_ d e f
x_y_ g h i
x_y_ k l m

J'ai besoin qu'il soit formaté comme suit:

a b c
x_y_
d e f
x_y_
g h i
x_y_
k l m
x_y_

En utilisant sed, awk ou autre chose dans bash, comment y parvenir?


2 commentaires

Vous pouvez utiliser awk et mettre deux conditions, si NR% 2 == 1 pour imprimer les lignes impaires et NR% 2 == 0 pour imprimer même rangées


Noté - J'ajouterai ce que j'ai essayé la prochaine fois.


6 Réponses :


0
votes

1ère solution: Pourriez-vous s'il vous plaît essayer de suivre, testé et créé avec GNU awk .

x_y_ a b c
x_y_ d e f
x_y_ g h i
x_y_ k l m

OU (avec print):

awk 'prev && FNR%2==0{print  $0 OFS prev;prev="";next} {prev=$0} END{if(prev){print prev}}'  Input_file

2ème solution: En vérifiant si un le numéro de ligne est complètement divisé par 2 puis imprime les valeurs des lignes précédentes et actuelles. Il vérifie également si le nombre total de lignes est ODD dans Input_file, puis il imprime également la dernière ligne restante (en vérifiant l'état d'un indicateur (variable)).

awk -v RS="" -v FS="\n" '{for(i=2;i<=NF;i+=2){print $i,$(i-1)}}' Input_file

La sortie sera comme suit.

awk -v RS="" -v FS="\n" '{for(i=2;i<=NF;i+=2){printf("%s\n",$i OFS $(i-1))}}' Input_file


0 commentaires

1
votes

Avec sed:

sed -E 'N;s/(.*)\n(.*)/\2 \1/g' sample.txt


0 commentaires

1
votes

un court pipeline:

tac file | paste -d ' ' - - | tac


0 commentaires

3
votes

Un autre awk:

...
x_y_ g h i
x_y_ k l m
x y z

Sortie:

$ awk 'NR%2==0{print $0,p}{p=$0}END{if(NR%2)print}' file

Expliqué:

$ awk '
NR%2==0 {          # on every even numbered record
    print $0,p     # output current record and previous
}{
    p=$0           # buffer record for next round
}' file

Mise à jour :

En cas de nombre impair d'enregistrements (principalement en raison de la pression des pairs :), vous devez gérer le code xyz restant >:

x_y_ a b c
x_y_ d e f
x_y_ g h i
x_y_ k l m

Résultat:

$ awk 'NR%2==0{print $0,p}{p=$0}' file


3 commentaires

C'est vrai, mais comme ils sont imprimés par paires, j'ai supposé un nombre pair d'enregistrements (lire: cela ne peut pas se produire sur mon spectre). Très bien, je vais le réparer.


@ RavinderSingh13 Vous avez été mentionné dans la mise à jour. ; D Merci.


Merci pour la réponse claire et l'explication!



1
votes
$ awk 'NR%2{s=$0; next} {print $0, s}' file
x_y_ a b c
x_y_ d e f
x_y_ g h i
x_y_ k l m

0 commentaires

0
votes

Cela pourrait fonctionner pour vous (GNU sed):

parallel -N2 echo "{2} {1}" :::: file

Enregistrez les lignes numérotées des lignes impaires dans l'espace d'attente et ajoutez-les aux lignes paires et remplacez la nouvelle ligne par un espace. p>

Autre variante:

sed -n 'h;n;G;s/\n/ /p' file

Il existe de nombreuses autres façons d'y parvenir, comme le montrent les réponses ci-dessus.

Que diriez-vous de ceci :

sed '1~2{h;d};G;s/\n/ /' file

Voir ici pour le parallèle.


0 commentaires