J'ai besoin de transposer un file.
Fichier d'input:
1/1/1111 1 2 3 4 2/2/2222 5 6 7 8
Sortie:
1/1/1111 1 2 3 4 2/2/2222 5 6 7 8
Avec sed
:
$ sed -e ' :1 $!N /\n$/{ P d } s/\n/ / t1 ' <file
En perl
perl -lp00e 's/\n/ /g' your_file
Explication
l
: Supprime le séparateur d'loggings d'input de l'logging en cours de traitement et ajoute le séparateur d'loggings de sortie en cours (une nouvelle ligne par défaut) après chaque ligne imprimée. -p
: Opère l'logging du file par logging et imprime l'logging en cours après le traitement. -00
: Signifie que le séparateur d'loggings est deux lignes consécutives ou plus -e
: exécute la string suivante en tant que code tout en définissant la variable par défaut ( $_
) sur l'logging en cours de lecture à partir du file. s/\n/ /g
: Remplacer chaque nouvelle ligne rencontrée dans l'logging en cours par un espace (le modificateur g
garantit que le rlocation est "global"). Avec awk
:
awk '{ORS=" ";}; !NF{ORS="\n"};1' file
La variable ORS
spécifie le séparateur d'loggings de sortie . Si le nombre de champs est zéro (la ligne est vide), le séparateur d'loggings doit être une nouvelle ligne, sinon un espace. Le 1
à la fin signifie simplement une condition positive, donc awk
imprime toute la ligne.
sont-ils tous du même format, soit 6 lignes pour chaque bloc? si c'est le cas, paste
est le plus simple (c'est-à-dire 6 tirets):
paste - - - - - - < file
Si vous avez besoin d'espaces plutôt que d'tabs, ajoutez -d' '
Qu'en est-il de xargs
xargs -n5 < input_file
ou awk
awk '{a=(NR%6==0)?"":a$0" ";if(NR%6==5)print a}' inp