substituindo uma parte do nome da linha pelo nome da amostra

1

Eu tenho vários exemplos chamados p1_500sc.fasta, p2_500sc.fasta ... Cada arquivo loks assim:

>NODE_60_length_504_cov_1.580902
TATATCGCCGTAGATAGACGAATACGGGATTTTGAAATGACTGATATATTCAAGCACATC
CTGTTCAGTCCAAAATGACATCGGCTTCGATTTCGGGATTGCCCCCGCAAAGTTGTTACA
>NODE_61_length_503_cov_4.457447
GATATGGGCCGGTGAGCATGCTGTCACATTTTGGGCAGGTGCCGAGGATTATGAGCTCGT
CTTCCGGCGTCAACGCTTGTTCGTTGCGTCTGGTGATGTGTTCCAGAGCGGCATAGTCGT
>NODE_62_length_500_cov_4.037534
CTCGTTCTTGCACTCCTGAATGAAGCGAATCTCTGACGAGGGTATTCCATAATCCTCTAT
CAGCTTACGCTTGATTTCTG
>NODE_63_length_500_cov_1.718499
GGAGGATATCAATGCCCTTATACTGCTTCTCAACAGTAGGAGTAATGCGGATACCCAAAA
CGGTCTTAGGGTTCTCCAGCAACTTCATGGCATTCCAACGCTTCAAGTCATCCATGCGGA
AGCCTTCGGCT

Como você sempre vê, há uma frase NODE. Para cada arquivo eu gostaria de alterar "NODE" para o indicador de arquivo do nome da amostra: p1 / p2 / p100 ... pn

A saída deve ficar assim para o arquivo p1_500sc.fasta:

>p1_60_length_504_cov_1.580902
TATATCGCCGTAGATAGACGAATACGGGATTTTGAAATGACTGATATATTCAAGCACATC
CTGTTCAGTCCAAAATGACATCGGCTTCGATTTCGGGATTGCCCCCGCAAAGTTGTTACA
>p1_61_length_503_cov_4.457447
GATATGGGCCGGTGAGCATGCTGTCACATTTTGGGCAGGTGCCGAGGATTATGAGCTCGT
CTTCCGGCGTCAACGCTTGTTCGTTGCGTCTGGTGATGTGTTCCAGAGCGGCATAGTCGT
>p1_62_length_500_cov_4.037534
CTCGTTCTTGCACTCCTGAATGAAGCGAATCTCTGACGAGGGTATTCCATAATCCTCTAT
CAGCTTACGCTTGATTTCTG
>p1_63_length_500_cov_1.718499
GGAGGATATCAATGCCCTTATACTGCTTCTCAACAGTAGGAGTAATGCGGATACCCAAAA
CGGTCTTAGGGTTCTCCAGCAACTTCATGGCATTCCAACGCTTCAAGTCATCCATGCGGA
AGCCTTCGGCT

Para o arquivo p123_500sc.fasta

>p123_2_length_456_cov_4.453333
GATATGGGCCGGTGAGCATGCTGTCACATTTTGGGCAGGTGCCGAGGATTATGAGCTCGT
CTTCCGGCGTCAACGCTTGTTCGTTGCGTCTGGTGATGTGTTCCAGAGCGGCATAGTCGT
>p123_356_length_3_cov_4.037908
CTCGTTCTTGCACTCCTGAATGAAGCGAATCTCTGACGAGGGTATTCCATAATCCTCTAT
CAGCTTACGCTTGATTTCTG

O mesmo para qualquer outra amostra. Inicie a amostra a partir de p1 e eles podem alcançar p150.

    
por k_a_r_o_l 07.06.2018 / 12:08

3 respostas

2

Solução

bash + sed :

for f in p[0-9]*.fasta; do
    pfx="${f%%_*}"
    sed -i "s/^>NODE/>$pfx/" "$f"
done
  • pfx="${f%%_*}" - trunca a parte direita do nome do arquivo até o último _ ; atribua o resultado à variável pfx
  • sed -i "s/^>NODE/>$pfx/" - substitua >NODE substring pela variável $pfx in-place
por 07.06.2018 / 12:42
1

Com o GNU awk , você pode fazer isso em uma única chamada de comando:

gawk -i inplace -F_ -v OFS=_ '
  BEGINFILE {
    node = FILENAME
    sub(".*/", "", node)
    sub("_.*", "", node)
  }
  $1 == ">NODE" {$1 = ">" node}
  {print}' ./p*_*.fasta
    
por 07.06.2018 / 13:00
0

Isso fará um loop em cada arquivo, atribuirá o tudo antes do sublinhado no nome do arquivo à variável sample e, em seguida, substituirá >NODE para $sample no arquivo usando sed :

for file in /path/to/files/*;do
  sample=$(echo "${file}" | sed s/_.*//)
  sed -i "s/^>NODE/${sample}/" ${file}
done
    
por 07.06.2018 / 12:42