[bash] Ajouter des colonnes à un fichier

Résolu/Fermé
tibofx Messages postés 14 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 23 janvier 2008 - 4 janv. 2008 à 18:25
tibofx Messages postés 14 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 23 janvier 2008 - 4 janv. 2008 à 20:47
Bonjour,
J'ai un fichier à nombre de colonnes variable, et une dizaine de miliers de lignes. Je voudrais pouvoir "compléter" les colonnes par des zéros pour qu'elles aient toutes la même taille, soit 400. Si cela est trop complexe à réaliser, je peux me satisfaire au pire de remplacer, sachant que j'ai au moins 385 colonnes, toutes les colonnes à partir de 385 jusqu'à 400 par des zéros.
Exemple :
... 0 3 6 1 0 (colonne 400)
... 0 0
... 2 1 8

et je veux :
... 0 3 6 1 0
... 0 0 0 0 0
... 2 1 8 0 0

Quelqu'un aurait-il une idée ??? Merci !

Tibo.
A voir également:

8 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
4 janv. 2008 à 19:19
Salut,

Si toutes les colonnes ne comportent qu'un seul caractère, tu peux essayer ça :
sed -e ':boucle;s/^.\{1,800\}$/& 0/; t boucle' fichier
Si c'est concluant, tu peux soit redirigé la sortie (> fichier.sortie), soit si tu as une version de GNU sed 4.0 ou supérieure utiliser le switch "-i".

Un petit exemple :
$ cat plop
1 2 3 4 5 6 7 8 9
1 5 6 3
2 5 9 7 8
2 6 0 1 1 5
9 5 1

$ sed -e ':boucle;s/^.\{1,20\}$/& 0/; t boucle' plop
1 2 3 4 5 6 7 8 9 0 0
1 5 6 3 0 0 0 0 0 0 0
2 5 9 7 8 0 0 0 0 0 0
2 6 0 1 1 5 0 0 0 0 0
9 5 1 0 0 0 0 0 0 0 0
;-))

0
tibofx Messages postés 14 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 23 janvier 2008
4 janv. 2008 à 19:39
Salut, et merci pour ta réponse ! En effet ça me fait bien l'effet que tu me décris, mais le probleme est que je voudrais le faire seulement une ligne sur deux, car avant chacune de ces lignes de nombres, j'ai un en-tête sur une ligne. Donc je m'y replonge !
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
4 janv. 2008 à 20:01
Essaye ça alors :
$ cat plop
1er en-tête
1 2 3 4 5 6 7 8 9
2ème en-tête
1 5 6 3
3ème en-tête
2 5 9 7 8
4ème en-tête
2 6 0 1 1 5
5ème en-tête
9 5 1

$ sed -e '2~2 {:boucle;s/^.\{1,20\}$/& 0/; t boucle}' plop
1er en-tête
1 2 3 4 5 6 7 8 9 0 0
2ème en-tête
1 5 6 3 0 0 0 0 0 0 0
3ème en-tête
2 5 9 7 8 0 0 0 0 0 0
4ème en-tête
2 6 0 1 1 5 0 0 0 0 0
5ème en-tête
9 5 1 0 0 0 0 0 0 0 0
;-))
0
tibofx Messages postés 14 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 23 janvier 2008
4 janv. 2008 à 20:15
En fait ça me fait des choses bizarres cette affaire, exemple :
#Input 1
0 0 0 0 1 0 0 0 0 0 2
#Output 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

#Input 2 0 0 0 0 0 0 0
0 2 0 0 1 0 0
#Output 2 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Donc en gros ça me rajoute une fois sur deux des zeros aux en-têtes !! Merci quand même pour ta réponse, maintenant je vais plutot chercher, à partir de ta première solution, les en-têtes (qui sont dc maintenant de la forme #Input 2 0 0 0 0 0 0 ) et les remplacer par les en-têtes normaux (#Input x ou #Output x)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
4 janv. 2008 à 20:16
Si l'en-tête ne commence pas par un chiffre mais par tout autre caractère, alors il vaut mieux cette syntaxe :
sed -e '/^[0-9]/ {:boucle;s/^.\{1,20\}$/& 0/; t boucle}'
;-))
0
tibofx Messages postés 14 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 23 janvier 2008
4 janv. 2008 à 20:33
Ah merci bien !!! Juste un détail encore que je suis entrain d'essayer de régler, c'est que je ne voulais pas toucher aux chiffres qui suivent mes "Output x", et seulement mes "Input x"... J'y retourne j'y retourne, mais merci beaucoup tes réponses sont toujours rapides claires et efficaces c'est génial !
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
4 janv. 2008 à 20:41
$ cat bar
#Input 1
0 0 0 0 1 0 0 0 0 0 2
#Output 1
1 0 0 0 0 0 0 0 0 0 0 0
#Input 1
0 0 0 0 1 0 0 0 0 0 2
#Output 1
1 0 0 0 0 0 0 0 0
#Input 1
0 0 0 0 1 0 0 0 0 0 2
#Output 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0

$ sed -e '/^#Input/ {n; :boucle;s/^.\{1,30\}$/& 0/; t boucle}' bar
#Input 1
0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0
#Output 1
1 0 0 0 0 0 0 0 0 0 0 0
#Input 1
0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0
#Output 1
1 0 0 0 0 0 0 0 0
#Input 1
0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0
#Output 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0
;-))
0
tibofx Messages postés 14 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 23 janvier 2008
4 janv. 2008 à 20:47
..merci ! c'est bien ce que je pensais ;)
0