Shell - Convertir une colonne en plusieurs

Fermé
Jiboule - 7 févr. 2011 à 09:25
 Jiboule - 8 févr. 2011 à 15:24
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 :

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.


A voir également:

1 réponse

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
7 févr. 2011 à 13:54
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

$

;-))
0
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.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
7 févr. 2011 à 15:06
Par contre, l'exemple que je donnais n'est pas vraiment celui que je souhaite utiliser,
C'est bien pourquoi j'avais préviendu ;-))

Sinon, jette un oeil à cette astuce dans la FAQ :
Transformer des colonnes en lignes dans un fichier...
0
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 !
0