J'ai un fichier avec un sous-ensemble de geneID et un fichier fasta avec tous les geneID et leurs séquences. Pour chaque gène du fichier de sous-ensemble, je souhaite obtenir les positions 2 à 7 à partir du début de chaque séquence fasta. Idéalement, le fichier de sortie serait 'pos 2-7' '\ t' 'geneID'.

Exemple de sous-ensemble:

mmu-let-7g-5p MIMAT0000121  
mmu-let-7i-5p MIMAT0000122 

Fichier Fasta:

>mmu-let-7g-5p MIMAT0000121 
UGAGGUAGUAGUUUGUACAGUU
>mmu-let-7i-5p MIMAT0000122 
UGAGGUAGUAGUUUGUGCUGUU
>mmu-let-7f-5p MIMAT0000525 
UGAGGUAGUAGAUUGUAUAGUU

Sortie souhaitée:

GAGGUA   mmu-let-7g-5p MIMAT0000121
GAGGUA   mmu-let-7i-5p MIMAT0000122

La première partie (extraire les séquences fasta pour le sous-ensemble de gènes) que j'ai fait en utilisant grep -w -A 1 -f. Je ne sais pas comment obtenir la pos 2-7 et faire en sorte que la sortie ressemble à cela maintenant en utilisant Bash.

2
sian 19 oct. 2020 à 15:05

2 réponses

Un autre awk:

$ awk '
{
    gsub(/ +$/,"")                 # clean trailing space from sample data 
}
NR==FNR {                          # process subset file as it is smaller
    a[$0]                          # hash keys
    next                        
}                                  # process fasta file
/^>/ && ((p=substr($0,2)) in a) {  # if string found in hash
    if(getline>0)                  # read next record
        print substr($0,2,6),p     # and print
}' subset fasta

Production:

GAGGUA mmu-let-7g-5p MIMAT0000121
GAGGUA mmu-let-7i-5p MIMAT0000122
2
James Brown 19 oct. 2020 à 13:47

Testé avec GNU awk, mais je pense que cela fonctionnera avec n'importe quel awk:

$ awk 'NR==FNR{a[$0]; next}
       $1 in a{print substr($2, 2, 6), $1}
      ' gene.txt RS='>' FS='\n' OFS='\t' fasta.txt
GAGGUA  mmu-let-7g-5p MIMAT0000121
GAGGUA  mmu-let-7i-5p MIMAT0000122
  • NR==FNR{a[$0]; next} construire un tableau avec chaque contenu de ligne comme clé pour le premier fichier passé à awk
  • RS='>' FS='\n' OFS='\t' ceux-ci définiront le séparateur d'enregistrement d'entrée sur >, le séparateur de champ d'entrée sur nouvelle ligne et le séparateur de champ de sortie sur tabulation uniquement pour le deuxième fichier (puisque ces variables sont attribuées après le premier nom de fichier)
  • $1 in a{print substr($2, 2, 7), $1} si le premier champ existe en tant que clé dans le tableau a, imprimez les détails requis

S'il peut y avoir des espaces blancs à la fin des lignes, utilisez:

$ awk 'NR==FNR{sub(/[[:space:]]+$/, ""); a[$0]; next}
       $1 in a{print substr($2, 2, 6), $1}
      ' gene.txt RS='>' FS='[[:space:]]*\n' OFS='\t' fasta.txt
5
Sundeep 19 oct. 2020 à 14:19