Joindre ou concaténer horizontalement plusieu

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

  • Votes
  • Date
  • Date décroissante
  1. 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. Contributeur
      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
    2. Contributeur
      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 ;-\
  2. Contributeur
    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 ?
    1. 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à...
      1. Contributeur
        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 ...
        $ 
        1. Contributeur
          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
          
          $ 

          ;-))
        2. Et moi je partais sur un join, mais bon je ne vais pas chercher la ligne exacte du coup :)
        3. Contributeur
          Ben le "join" ne marche que sur 2 fichiers et à moins de se lancer dans une boucle... ;-\
        4. 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.
        5. Contributeur
          Suffit de rajouter une redirection ;-\

          paste -d '|' f* | sed 's/|[^ ]*//g' > new_fichier
      2. 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.
        1. Contributeur
          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 ?
        2. 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.
        3. Contributeur
          mais j'ai pas très envie d'entrer à la main le nom des trente fichiers à concaténer
          Tu peux user du "*" à la place ;-))
        4. Contributeur
          tout à fait
        5. Contributeur
          Sinon essaye avec :

           paste -d '|' *.asc  | sed 's/|[^\t]*\t/\t/g' > new_fichier.txt 
      3. Comme ceci par exemple ? :
        awk '{n=$1 ; $1="" ; x[n]=x[n] $0} END {for(n in x) print n, x[n]}' ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
        1. Contributeur
          non
          awk ... *.asc
      4. Contributeur
        essayer avec join
        $ ls *.asc | awk '{x="|join - "} NR<2{x="cat "} {printf x $1}' | sh
        1. Contributeur
          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 ;-))
        2. Contributeur
          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)
        3. Contributeur
          Ok merci beaucoup ;-))