2017-07-15 2 views
1

** Il semble y avoir une réponse partielle ici, mais l'utilisateur a rencontré le même problème que moi: il est important de préserver le schéma de nommage d'origine.Concaténation de paires de fichiers avec un schéma de nommage spécifique (UBUNTU)

Loop to concatenate multiple pairs of files with almost the same name in UNIX **

J'ai un dossier avec des fichiers Paired; les noms ressemblent à ceci (tous sont stockés dans le même dossier/répertoire):

MX_HF20.1.fq.gz; MX_HF20.rem.1.fq.gz

MX_HF22.1.fq.gz; MX_HF22.rem.1.fq.gz

.

.

.

SD_F296.1.fq.gz; SD_F296.rem.1.fq.gz

SD_F297.1.fq.gz; SD_F297.rem.1.fq.gz

(Certains d'entre vous reconnaître en sortie STACKS!)

Vraiment, je suis à la recherche d'ajouter le contenu du * .1.rem.fq Fichier .gz à la fin du fichier * .1.fq.gz, en conservant le nom du fichier * .1.fq.gz d'origine. Je ai joué avec des fichiers de test, donc je sais que cat va le faire même si les fichiers sont. Gz. Mais mes capacités de script bash sont au mieux médiocres, et travailler avec et stocker des variables de nom est un concept que je n'arrive toujours pas à saisir.

Merci beaucoup!

Répondre

1

Peut-être essayer en utilisant match retour bash:

#!/bin/bash 

p='([A-Z]+_[A-Z]+)([0-9]+)\.1\.rem\.fq\.gz' 

for f in *.gz; do 
    if [[ $f =~ $p ]]; then 
     cat "${f}" >> "${BASH_REMATCH[1]}${BASH_REMATCH[2]}.1.fq.gz" 
    fi 
done 

Ainsi, par exemple:

SD_F297.1.rem.fq.gz sera annexé à SD_F297.1.fq.gz

+0

Merci pour votre réponse! J'ai essayé ceci, et le manuscrit s'exécute sans des erreurs, mais il ne semble pas changer n'importe quel dossier du tout (j'ai fait des beaucoup plus petits, textes de texte plus simples (gzipped) avec des noms identiques à ceux ci-dessus). J'ai essayé de changer le terme * .txt en * .fq.gz, et le résultat était le même. Pourrait-il y avoir quelque chose qui me manque là? Peut-être que le script ne trouve rien à opérer. – canfiese

+0

@canfiese: Ça devrait marcher, et je suis surpris que ce ne soit pas le cas. Peut-être essayer de mettre "echo" devant "chat" pour voir ce qui se passe.L'écho ne changera pas le fichier mais devrait vous montrer ce qui pourrait arriver. –

+0

Je suis tellement désolé, je suis un idiot. Le schéma de nommage ci-dessus est incorrect. Cela devrait être * .rem.1.fq.gz. Je l'ai changé et il a fait quelque chose ... mais il a fait mon fichier de test 175 Mo (à partir de 16 octets), et il ne serait pas ouvert. Ce qui est étrange, mais je l'ai déjà vu. Doit être une particularité de .gz ... – canfiese

0

On dirait que vous cherchez quelque chose comme ceci:

#!/bin/bash 
for file1 in *.1.fq.gz; do 
    file2=`echo $file1 | sed -E 's/(*\.1)\.fq\.gz/\1.rem.fq.gz/'` 
    cat $file1 $file2 > out.$file1 
done 

Les backquotes exécutent un shel commande l et insérer le résultat texte à ce point dans votre script

sed est l'éditeur de flux dans unix qui manipule des lignes de texte

Il utilise des expressions régulières, et dans ce cas vous avez besoin() pour le groupe et la capture la première partie du nom de fichier et \ 1 pour le référencer

+0

(Modifié) @ zakum1 Merci! Cela semble être vraiment sur la bonne voie (à partir du peu d'expérience que j'ai). Mais j'obtiens l'erreur suivante: sed: -e expression # 1, char 30: expression régulière précédente invalide – canfiese

+0

En outre, cela peut faire une différence ... mais j'ai dû modifier mon système de nom de fichier. C'est * .rem.1.fq.gz Oeuf sur mon visage. Pardon. : / – canfiese