Script para encontrar uma palavra ou string mais longa e mais curta em um arquivo? [fechadas]

1

Estou realizando o Genomics. Eu tenho um arquivo com as leituras do formato FASTA. Estes são genes. Cada gene é chamado de leitura ou contig. Cada contig começa com um cabeçalho e é seguido por alfabetos ou nusleotides, por exemplo: ACTG, de comprimento específico. Eu quero determinar o contig mais longo e o contig mais curto ou ler ou gene nesse arquivo. Por favor, me diga um script ubuntu para encontrar tais contigs. Cada contig ou read está neste formato FASTA é o seguinte:

>Locus_1000_Transcript_1/1_Confidence_0.000_Length_648 FTBs=645 (Header)
CcGccttggtaacctCgccAGcatATtgagcTttGGatccGGaTggtcgtaGaAtgGCaaG
GcaGgagAgAgtgtctaatgtggCgccGctctgtAccCgGgGGgTAACaAtgAATTtGCga
CgaCGtggTAtGcCcttCGttgAaacccTtaTtagttGgAGCcGctAtgtggcgGTccaat
TaTcaagtAttTcCCACaTcttgAagCgcttcTgGATgTacgCatactatgggTtgacgtt
AGtGtAgCcgAgattTCacaGtAgctcCGAACGgtgGTagCAgacGcccGttCacAAaAaC

O cabeçalho tem um formato definido que mostra locos gênicos e número de genes e haverá espaço entre cada contig ou lido. Cada um dos meus ler ou contig em um arquivo será iniciado com um cabeçalho do mesmo tipo como mencionado acima, mas os valores podem ser diferentes. Cada contig ou read começa com > placa. Pode haver contigs do mesmo tamanho. - Ciência há 3 minutos

    
por Science 31.10.2016 / 16:55

2 respostas

2

Assumindo que os valores Length nos cabeçalhos FASTA estão corretos, eu os extrairia de lá:

sed -nre 's/^>.*_Length_([0-9]+) .*//p' \

classifique-os numericamente

| sort -n \

em seguida, imprima a primeira e a última linha

| sed -ne '1p;$p'

Em uma declaração:

sed -nre 's/^>.*Length_([0-9]+) .*//p' | sort -n | sed -ne '1p;$p'

Se os comprimentos declarados nos cabeçalhos não puderem ser confiáveis, então, para contar a duração das seqüências do FASTA, eu primeiro os converteria em unfasta , em seguida, imprima o comprimento da linha de cada segunda linha no mesmo filtro sort | sed como acima:

uf | awk 'NR%2==0 {print length}' | sort -n | sed -n '1p;$p'

Onde uf é o script bash simples encontrado aqui .

Observação: os dois marcadores são filtros, ou seja, eles lêem suas entradas da entrada padrão e gravam na saída padrão. Use cat para alimentá-los com arquivos (ou wget -O - para alimentá-los pela Internet).

    
por zwets 31.10.2016 / 20:30
1

Este script python cria um dicionário de registros e usa uma pesquisa linear para descobrir qual é o mais curto, qual é o mais longo no arquivo. Note que isto ignora casos em que existem dois contigs do mesmo valor (embora isso também possa ser implementado.

Código:

#!/usr/bin/env python3

import sys
def main():
    records = {}
    current_length = 0
    current_contig = ''
    with open(sys.argv[1]) as f:
        for index,line in enumerate(f,1):
            if line == '\n': continue
            if line.startswith('>'):
               if current_contig != line:
                   records[current_contig] = current_length
                   current_contig = line.strip()
                   current_length = 0
            else:
               current_length = current_length + len(line.strip())
    records[current_contig] = current_length
    records.pop('')

    shortest_contig = None
    longest_contig = None 
    longest_val = 0
    shortest_val = float("inf")
    for contig,length in records.items(): 
        if length < shortest_val:
            shortest_val = length
            shortest_contig = contig
        if length > longest_val:
            longest_val = length
            longest_contig = contig
    print('Longest: ' + longest_contig)
    print('Shortest: ' + shortest_contig)


if __name__ == '__main__': main()

Execução de teste:

$ cat input.txt                                                                                                                  
> Entry 1
CcGccttggtaacctCgccAGcatATtgagcTttGGatccGGaTggtcgtaGaAtgGCaaG
GcaGgagAgAgtgtctaatgtggCgccGctctgtAccCgGgGGgTAACaAtgAATTtGCga
CgaCGtggTAtGcCcttCGttgAaacccTtaTtagttGgAGCcGctAtgtggcgGTccaat
TaTcaagtAttTcCCACaTcttgAagCgcttcTgGATgTacgCatactatgggTtgacgtt
AGtGtAgCcgAgattTCacaGtAgctcCGAACGgtgGTagCAgacGcccGttCacAAaAaC

> Entry 2
CcGccttggtaacctCgccAGcatATtgagcTttGGatccGGaTggtcgtaGaAtgGCaaG
GcaGgagAgAgtgtctaatgtggCgccGctctgtAccCgGgGGgTAACaAtgAATTtGCga
CgaCGtggTAtGcCcttCGttgAaacccTtaTtagttGgAGCcGctAtgtggcgGTccaat
TaTcaagtAttTcCCACaTcttgAagCgcttcTgGATgTacgCatactatgggTtgacgtt
AGtGtAgCcgAgattTCacaGtAgctcCGAACGgtgGTagCA
$ python3 contigs.py  input.txt                                                                                                   
Longest: > Entry 1
Shortest: > Entry 2
    
por Sergiy Kolodyazhnyy 31.10.2016 / 20:06