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?
6 Réponses :
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
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
Avec sed:
sed -E 'N;s/(.*)\n(.*)/\2 \1/g' sample.txt
un court pipeline:
tac file | paste -d ' ' - - | tac
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
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!
$ 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
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.
Vous pouvez utiliser
awk
et mettre deux conditions, siNR% 2 == 1
pour imprimer les lignes impaires etNR% 2 == 0
pour imprimer même rangéesNoté - J'ajouterai ce que j'ai essayé la prochaine fois.