adiciona um nome de arquivo a linhas neste arquivo

2

Eu tenho arquivos fasta, provenientes de amostras diferentes, por exemplo: 01.fasta, 02.fasta, etc.

Todos eles contêm lista de OTU com o seguinte padrão:

>OTU1
CCTACGGGCGGCTGCAGT

>OTU2
CCTACGGGTGGCTGCAG

Eu gostaria de adicionar o nome do arquivo (por exemplo, 01, 02, etc) a cada linha >OTU* no arquivo fasta para receber o seguinte: >OTU1_01 , >OTU2_01 , etc.

Você pode me ajudar a escrever um script que o faça automaticamente para todos os arquivos da minha pasta?

    
por Joan 27.05.2016 / 16:16

2 respostas

3

Certifique-se de ter um backup dos seus arquivos antes de começar a alterá-los todos

Você pode executar algo como o seguinte:

for i in *.fasta; do nr="${i%.fasta}"; sed -i 's/^>OTU\(.*\)$/>OTU_'$nr'/' "$i"; done

se você tiver uma versão de sed que suporte -i (edição em vigor).

A parte nr="${i%.fasta}" obtém o número do nome do arquivo. O \(.*\) corresponde ao número após >OTU , que depois é reinserido com

    
por 27.05.2016 / 16:39
0

gawk 4.1.0 em diante, uma opção de edição no local está disponível. Então, de uma só vez

awk -i inplace -v INPLACE_SUFFIX=.bak '
  BEGINFILE{x=FILENAME; sub(/\..*/, "", x)};
  /^>OT/{$0 =$0"_"x};
  {print}' *.fasta

atualizará os arquivos conforme necessário no local. -v INPLACE_SUFFIX=.bak faz o backup dos arquivos originais com um sufixo .bak

    
por 28.05.2016 / 02:08