Joindre ou concaténer horizontalement plusieu
jil
-
zipe31 Messages postés 38797 Statut Contributeur -
zipe31 Messages postés 38797 Statut Contributeur -
Salut
je cherche à joindre plusieurs fichiers de manière horizontale et la commande :
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 !
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 !
A voir également:
- Joindre ou concaténer horizontalement plusieu
- Concatener deux cellules excel - Guide
- Inverse de concatener excel ✓ - Forum Bureautique
- Excel - Inverse de Concatenate ✓ - Forum Excel
- Diviser une cellule excel en deux horizontalement - Forum Excel
- Diviser page word en 3 horizontalement - Forum Word
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.
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.
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 ?
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 ?
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à...
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à...
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 ...
$
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 $
;-))
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Re salut. Merci. J'y ai pas pensé :/ .
Alors :
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.
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.
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.
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.
Comme ceci par exemple ? :
awk '{n=$1 ; $1="" ; x[n]=x[n] $0} END {for(n in x) print n, x[n]}' ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
awk '{n=$1 ; $1="" ; x[n]=x[n] $0} END {for(n in x) print n, x[n]}' ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
essayer avec join
$ ls *.asc | awk '{x="|join - "} NR<2{x="cat "} {printf x $1}' | sh
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)
on peut encore simplifier avec join:
ls *.asc | awk -v s="cat " '{printf s $1 ; s=" | join - "} | sh