Shell - Convertir une colonne en plusieurs
Jiboule
-
Jiboule -
Jiboule -
Bonjour,
J'ai un problème assez simple je pense, mais je ne trouve pas de solution :
Comment faire pour passer d'un fichier contenant ça :
à un fichier contenant ça :
Je vous remercie et vous souhaite une bonne journée.
J'ai un problème assez simple je pense, mais je ne trouve pas de solution :
Comment faire pour passer d'un fichier contenant ça :
1 2 2 3 3 3 4 4 4 4
à un fichier contenant ça :
1 2 3 4
2 3 4
3 4
4
Je vous remercie et vous souhaite une bonne journée.
1 réponse
-
Salut,
Allez juste pour le fun...
Ce n'est pas ce qui se fait de mieux. Ce n'est valable que pour l'exemple fourni.
$ cat plop 1 2 2 3 3 3 4 4 4 4 $ cat script.sed #n 1 h /^$/ { N s/\n// H } $ { g s/\n/ /g p :z s/[^ ] */ /p t z } $ sed -f script.sed plop 1 2 3 4 2 3 4 3 4 4 $
;-))
-
Hey ! Merci Zipe !
J'essaie de bien comprendre ta solution, mais elle est sympa !
Par contre, l'exemple que je donnais n'est pas vraiment celui que je souhaite utiliser, mais plutot un colonne de plusieurs blocs de différentes valeurs et de différentes tailles, du genre :
$ cat plop 27466,15 15504,765 0 0 0 ... 186000/3,9061e-07/6,9060e-08 ... 223050/1586,1107 ...
Que je souhaite mettre comme ceci :
$ cat plop_final 27466,15 186000/3,9061e-07/6,9060e-08 223050/1586,1107 15504,765 ... ... 0 0 ...
Perso je pensais, séparer mon premier fichier en n fichiers, n étant le nombre de blocs, avec le même nombre de lignes (bien que mes blocs soit de tailles différentes => ajouter des blancs), et après lisant chaque fichier ligne par ligne, essayer de regrouper chaque ligne. Mais comme je travaille avec des fichiers de près de plusieurs milliers de lignes, ça risque de prendre un peu de temps. -
-
Salut à vous !
Voici finalement ce que j'ai fait :
$ cat plop 27466,15 0 0 ... 15504,765 1 2 ... 186000/3,9061e-07/6,9060e-08 ... 223050/1586,1107 ...
$ cat script_colonne2colonnes.sh rm test.txt # tail +2 : 2 premiers blocs sur la même colonne cat plop | grep -n ^$ | sed -e "s/\(.*\):/\1/" | tail +2 > nb_blanc.dat un=1 nom=1 while read line; do deux=$(echo $line) deux=$(($deux-1)) sed -n "${un},${deux}p" plop > $nom.dat un=$(($deux+2)) nom=$(($nom+1)) done < nb_blanc.dat # 2.dat est le plus gros bloc max=$(wc -l 2.dat | sed -e "s/\(.*\)[[:space:]].*/\1/") max=$(($max+1)) for((i=1; i<$max; i++)); do un=$(sed -n "$i"p 1.dat) deux=$(sed -n "$i"p 2.dat) trois=$(sed -n "$i"p 3.dat) quatre=$(sed -n "$i"p 4.dat) cinq=$(sed -n "$i"p 5.dat) six=$(sed -n "$i"p 6.dat) sept=$(sed -n "$i"p 7.dat) echo $deux $trois $quatre $cinq $six $sept $un >> test.txt done # Je veux que / sépare chaque nombre cat test.txt | sed -e "s/[[:space:]]/\//g" > inter.txt mv inter.txt plop
C'est surement pas optimisé (ça prend 30s avec des blocs de 1000 lignes), mais ça marche.
Avez vous mieux ?
Bonne journée !
-