2010-10-11 6 views
2

Comment puis-je joindre tous les fichiers dans un répertoire. Je peux le faire en une étape en nommant explicitement les fichiers ci-dessous, est-il un moyen de le faire sans nommer explicitement les fichiers?Rejoindre tous les fichiers dans un répertoire

join <(\ 
join <(\ 
join <(\ 
join\ 
<(sort ${rpkmDir}/HS0477.chsn.rpkm)\ 
<(sort ${rpkmDir}/HS0428.chsn.rpkm))\ 
<(sort ${rpkmDir}/HS0419.chsn.rpkm))\ 
<(sort ${rpkmDir}/HS0299.chsn.rpkm))\ 
<(sort ${rpkmDir}/HS0445.chsn.rpkm) 

Répondre

2
#!/bin/bash 

data= 
for f in "${rpkmDir}"/HS*.chsn.rpkm 
do 
    if [ ! "$data" ] 
    then 
    data="$(sort "$f")" 
    continue 
    fi 
    data="$(join <(sort "$f") /dev/stdin <<< "$data")" 
done 
echo "$data" 
+0

Avez-vous besoin de "répercuter" $ data "'dans un tube dans bash? Ou expliquez-vous que vous avez généré le script et devez exécuter ce que vous avez produit en tant que script shell? –

+0

C'est en effet un script. J'avais espéré que la ligne de shebang au sommet l'aurait rendu apparent. –

+0

Ceci est un script qui écrit un script - je pense. Vous devez ensuite alimenter la sortie du script affiché dans le shell. Normalement, vous exécutez simplement un script pour ... exécuter les commandes. Ici, vous devez exécuter votre script, puis lancer bash sur la sortie. –

0

Vous pouvez le faire par chat ./*> outfile

+1

Non - cela ne fonctionne pas. La jointure trouve des lignes correspondantes dans les fichiers en fonction d'une clé (aucune clé n'étant spécifiée dans la première colonne de chaque fichier), en supposant que les fichiers sont tous triés dans le même ordre. –

1

Depuis le join (en classique UNIX et sous POSIX) est définie de sorte qu'il fonctionne sur strictement deux fichiers à la fois, vous allez devoir faire l'itération vous-même, en quelque sorte.

Bien que votre notation soit merveilleusement minime, elle est également impénétrable. Les chances sont que vous pouvez utiliser des tuyaux et le fait que '-' comme un nom de fichier dénote l'entrée standard pour modifier le séquençage, je pense. Mais le plus difficile est de tout relier sans créer de fichiers temporaires explicites. Il vaudrait peut-être mieux écrire simplement un script qui écrit la notation de votre script et l'alimenter en bash.

Peut-être (script non testé):

cd ${rpkmDir} 
ls HS*.chsn.rpkm | 
{ 
read file 
script="sort $file" 
while read file 
do 
    script="$script | join - <(sort $file)" 
done 
} | bash 
+0

Je n'étais pas au courant de l'astuce '-'. Merci +1 –

1

utilisation awk, dites que vous voulez rejoindre le 1er champ

awk '{a[$1]=a[$1] FS $0}END{for(i in a) print i,a[i]}' file* 
+0

Cela n'élimine pas les lignes où file1 contient la clé et file2 non - alors que la commande join (sans options) élimine les lignes sans correspondance. –

+0

corrigez-moi si je me trompe, mais je ne vois pas OP indiquant cette exigence. Et j'ai déjà indiqué dans mon post mon hypothèse basée sur un exemple sur le premier champ. Jusqu'à ce que l'OP développe son format de données, toutes les solutions seront basées sur des conjectures et des suppositions sauvages. BTW, il n'est pas si difficile d'inclure du code pour faire ce que vous supposez. – ghostdog74

+0

en utilisant une pâte d'une certaine manière semblerait être mieux pour cette application –

Questions connexes