Shell - Convertir une colonne en plusieurs

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 :

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   Statut Contributeur Dernière intervention   6 431
 
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
Jiboule
 
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   Statut Contributeur Dernière intervention   6 431
 
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
Jiboule
 
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