Joindre ou concaténer horizontalement plusieu

Fermé
jil - 23 mars 2012 à 11:24
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 26 mars 2012 à 09:16
Salut

je cherche à joindre plusieurs fichiers de manière horizontale et la commande :

join *.asc > all.txt 


ne fonctionne pas.

J'ai une trentaine de fichiers.
La première colonne de ces fichiers contient toujours la même chose, dans tous les fichiers.
Exemple :
fichier1.asc
1 ee
2 rr
3 4a
...

fichier28.asc
1 oa
2 0p
3 8ue
...

etc...
et j'aimerai avoir :

all.txt :

1 ee ... ... ... ... oa ...
2 rr ... ... ... ... 0p ...
3 4a ... ... ... ... 8ue ...
etc.


Merci d'avace !

7 réponses

Salut.

Ok alors ;

@zipe : paste -d '|' *.asc | sed 's/|[^\t]*\t/\t/g' > new_fichier.txt
ça marche pas très bien. Le résultat est concluant, mais j'ai deux trois endroits dans le fichier final qui comporte des trous, des décalages, et le dernier caractère du fichier est un pipe.

@dubcek : $ ls *.asc | awk '{x="|join - "} NR<2{x="cat "} {printf x $1}' | sh

ça ça marche admirablement bien.
Je me demande pourquoi c'est si compliqué pour faire une chose si simple mais bon... tant que "quelque chose" fonctionne... ;)
Faudrait aussi voir ce qui bug avec la formule de zipe , je reste persuadé qu'on peut en faire quelque chose.

Cdlt et bonne soirée.
1
dubcek Messages postés 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
Modifié par dubcek le 26/03/2012 à 08:51
le problème,c'est que join n'accepte que 2 fichiers en entrée et donc il faut bricoler
on peut encore simplifier avec join:
ls *.asc | awk -v s="cat " '{printf s $1 ; s=" | join - "} | sh
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 416
26 mars 2012 à 09:16
Il faudrait voir le contenu du fichier en entier. Peut être y-a-t-il des caractères (non-imprimable) que l'on ne voit pas et qui mettent le bronx ;-\
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 416
23 mars 2012 à 11:56
Salut,

Tes fichiers ont tous le même nombre de lignes et exactement la même valeur commune en début de ligne ?

Les espace entre chaque valeur sont-il toujours les mêmes (espace simple) ? Ou diffèrent-ils ?
0
Même nombre de lignes pour tous.

Même première "colonne", sparée de la deuxième par tabulation.

C'est vraiment simple. Mais je n'y arrive pas.

;) merci pour ta répose déjà...
0
dubcek Messages postés 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
23 mars 2012 à 12:43
hello
$ head a1 a2
==> a1 <==
1 ee ...
2 rr ...
3 4a ...

==> a2 <==
1 oa ...
2 0p ...
3 8ue ...
$ 
$ awk '{n=$1 ; $1="" ; x[n]=x[n] $0} END {for(n in x) print n, x[n]}' a1 a2
1  ee ... oa ...
2  rr ... 0p ...
3  4a ... 8ue ...
$ 
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 416
Modifié par zipe31 le 23/03/2012 à 13:44
Perso j'avais :

$ head f* 
==> f1 <== 
1 ee bla bla 
2 rr bli bli 
3 4a blu blu 

==> f2 <== 
1 oa gla gla 
2 0p gli gli 
3 8ue glu glu 

==> f3 <== 
1 bb pla pla 
2 0m pli pli 
3 5f1 flu flu 

$ paste -d '|' f* | sed 's/|[^ ]*//g'
1 ee bla bla oa gla gla bb pla pla
2 rr bli bli 0p gli gli 0m pli pli
3 4a blu blu 8ue glu glu 5f1 flu flu

$ 

;-))
0
Et moi je partais sur un join, mais bon je ne vais pas chercher la ligne exacte du coup :)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 416
23 mars 2012 à 13:59
Ben le "join" ne marche que sur 2 fichiers et à moins de se lancer dans une boucle... ;-\
0
exact ; "join" c'est pour deux fichiers que ça va bien...

Pour le reste, ta commande 'paste' ne crèe pas un nouveau fichier zipe ?!
j'ai essayé, et rien. il faudrait que ça puisse créer un nouveau fichier avec tous les petits fichiers concaténés horizontalement.

Et le problème, ce sont les noms de fichiers qui sont longs et pas très homogènes ; excepté l'extension : *.asc : th0293d24.asc par exemple.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 416
23 mars 2012 à 14:08
Suffit de rajouter une redirection ;-\

paste -d '|' f* | sed 's/|[^ ]*//g' > new_fichier
0

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

Posez votre question
Re salut. Merci. J'y ai pas pensé :/ .

Alors :

paste -d '|' *.asc | sed 's/|[^ ]*//g' > new_fichier.txt 


mais ça ne fonctionne pas. Enfin, il y a deux problèmes :
1. que deux colonnes.
2. que le premier fichier y est présent.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 416
Modifié par zipe31 le 23/03/2012 à 14:28
On peut avoir un aperçu du contenu de tes fichiers avec mise en forme respectée (espaces, tabulations, etc.) ?

As-tu essayé la solution de dubcek ?
0
700.000000 0.000980
699.800000 0.000993
699.600000 0.001009
699.400000 0.001026
699.200000 0.001042
699.000000 0.001051
698.800000 0.001051
698.600000 0.001045
698.400000 0.001038
698.200000 0.001032
698.000000 0.001024
697.800000 0.001015
697.600000 0.001007
....

chaque fichier contient la même première colone et la sépration entre les deux colonnes sont des tabulations.

je suis entrain d'essayer de comprendre la solution de dubcek mais j'ai pas très envie d'entrer à la main le nom des trente fichiers à concaténer ... surtout qu'ils sont longs ces noms.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 416
23 mars 2012 à 14:35
mais j'ai pas très envie d'entrer à la main le nom des trente fichiers à concaténer
Tu peux user du "*" à la place ;-))
0
dubcek Messages postés 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
23 mars 2012 à 14:38
tout à fait
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 416
23 mars 2012 à 14:40
Sinon essaye avec :

 paste -d '|' *.asc  | sed 's/|[^\t]*\t/\t/g' > new_fichier.txt 
0
Comme ceci par exemple ? :
awk '{n=$1 ; $1="" ; x[n]=x[n] $0} END {for(n in x) print n, x[n]}' ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
0
dubcek Messages postés 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
23 mars 2012 à 15:09
non
awk ... *.asc
0
dubcek Messages postés 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
23 mars 2012 à 16:08
essayer avec join
$ ls *.asc | awk '{x="|join - "} NR<2{x="cat "} {printf x $1}' | sh
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 416
23 mars 2012 à 16:21
Waouw, ça c'est fort en chocolat ;-))

Mais tu pourrais traduire s'teuplé ?
Mon cerval sedéen a du mal à capter toutes les subtilités ;-\

Merchi ;-))
0
dubcek Messages postés 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
Modifié par dubcek le 23/03/2012 à 16:45
comme join n'accepte que 2 fichiers, je construis une enfilade de commandes de join successifs , donc je joins a1 et a2, puis le résultat avec a3, etc
$ ls a* 
a1  a2 a3  a4 
$  
$ ls a* | awk '{x="|join - "} NR<2{x="cat "} {printf x $1}' 
cat a1|join - a2|join - a3|join - a4$  
$ 
j'ai essayé, mais pas pu : join fichier <(un truc récursif de join avec les autres fichiers)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 416
23 mars 2012 à 16:48
Ok merci beaucoup ;-))
0