Rechercher : dans
Par :

[bash] Ajouter des colonnes à un fichier

Dernière réponse le 4 jan 2008 à 20:47:40 tibofx, le 4 jan 2008 à 18:25:35 
 Signaler ce message aux modérateurs

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.

Configuration: Linux
Firefox 2.0.0.11

Meilleures réponses pour « [bash] Ajouter des colonnes à un fichier » dans :
Modifier son fichier Hosts VoirPOURQUOI modifier le fichier Hosts ? COMMENT modifier le fichier Hosts ? Où se trouve le fichier Hosts original ? Que contient-il ? Méthode de modification Restaurer le fichier Hosts à son état d'origine Alternative à Rhosts POURQUOI...
[Shell] Créer un fichier vide VoirPour créer un fichier vide, il vous suffit de taper la commande suivante : > fichier Vous pouvez également utiliser la commande touch : touch fichier
Télécharger Switch Audio Converter VoirSwitchest un convertisseur de formats audio pour Windows ou Mac, capable de convertir des fichiers audio à partir de différents formats en MP3 ou en WAV, notamment WAV en MP3, MP3 en WAV, WMA en MP3, MP3 vers WAM, etc. Ajoutez les fichiers à...
Linux - Gestion des utilisateurs VoirPremier pas de l'administrateur Lorsque diverses personnes ont accès à un système, il est nécessaire que l'administrateur système gère les utilisateurs. Pour ceci, les commandes usuelles et les fichiers à configurer doivent être connus. Les...

1

jipicy, le 4 jan 2008 à 19:19:24

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
;-))


Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

2

tibofx, le 4 jan 2008 à 19:39:49

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 !

Répondre à tibofx

3

jipicy, le 4 jan 2008 à 20:01:24

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
;-))

Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

4

tibofx, le 4 jan 2008 à 20:15:06

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)

Répondre à tibofx

5

jipicy, le 4 jan 2008 à 20:16:15

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}'
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

6

tibofx, le 4 jan 2008 à 20:33:39

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 !

Répondre à tibofx

7

jipicy, le 4 jan 2008 à 20:41:50

$ 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
;-))

Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

8

 tibofx, le 4 jan 2008 à 20:47:40

..merci ! c'est bien ce que je pensais ;)

Répondre à tibofx