Usando o awk para imprimir na última linha de cada arquivo e fechando

0

Portanto, tenho zero a nenhuma experiência em programação / codificação, embora esteja tentando evitar carregar, editar e salvar manualmente 1600 arquivos usando o AutoDock Tools.

Eu tenho 1600 arquivos PDB que eu preciso converter para o arquivo PDBQT para o encaixe autodockVina. Isso levaria um mês usando a GUI do ADT para que eu fizesse isso usando o awk. Sim, pensei em usar o openBabel para fazer isso, já que os arquivos PDB que tenho são de formato não padrão, não funciona.

Eu manejo para percorrer vários arquivos, lendo o PDB e reproduzindo os arquivos PDBQT usando um buttload de ifs aninhados. Eu agora não é bonita, em qualquer lugar, mas ainda é melhor do que a alternativa.

Tudo parece estar funcionando, exceto por três coisas

1) Eu tenho que adicionar "TER" como a última entrada de linha em todos os arquivos. Eu posso obtê-lo no último arquivo ou em cada arquivo, mas o último arquivo .... Eu não consigo descobrir onde colocar o "print" TER "> out1"

2) Eu estou supondo que eu possa precisar fechar a saída em algum momento para evitar a falta de memória, então talvez eu precise colocar um close (out1) em algum lugar.

3) Eu tenho um computador de "contagem sueca" que significa isso. e significa coisas diferentes. Desde que eu não consegui encontrar uma maneira de usar o gsub para converter "para trás" sem salvar tudo em um arquivo, abrindo esse arquivo, convertendo de volta e fechando, estou rodando o script como

LC_NUMERIC="us_US.UTF-8" ./awkFile.awk input.file

Existe alguma maneira de colocar isso no script em vez de no prompt?

Levou-me várias horas para chegar a este ponto e agora desisti :-) Qualquer ajuda é apreciada, é isso que tenho:

#!/usr/bin/awk -f

BEGIN { }
FNR==1 && NR!=1 { var=x=""; }  # works though skips the last file
FNR==1 { out1="scriptTest_"FILENAME".pdbqt"; print "REMARK   4 XXXX COMPLIES WITH FORMAT V. 2.0" > out1; next; }

{ endFunction(); print "TER" > out1;}
END {  }

function endFunction()
{
  var=""
    if ( $3 ~ "C" || $3 ~ "N" || $3 ~ "O" || /H5  MAA/ || /H16 DP/ || /H15 DP/ ) {
    # look for particular MAA atoms and assign the same values as in "FF"
    if ( /C   MAA X/ ) { var ="    0.170 C " }
    ...
    if ( /H5  MAA X/ ) { var ="    0.167 HD" }
    # look for particular XLI atoms and assign the same values as in "FF"
    if ( /C   XLI X/ || /C7  XLI X/ ) { var ="    0.054 C " }
    ...
    if ( /C3  XLI X/ || /C4  XLI X/ ) { var ="    0.206 C " }
#
        x+=1
        printf "%-s %6d %s %-3s %3s %s %3d %11.3f %7.3f %7.3f %5.2f %5.2f %s\n", $1, x, "", $3, $4, $5, $6, $7, $8, $9, $10, $11, var > out1;
  }
  # print "TER" > out1;  needs to be added after the last line in each file
  # I suppose I also need to solve the open-file issue.
  # close(out1); return
  # And the decimal point thing...
}

O ... está substituindo algo como 120 linhas de if's :-P

    
por gusgrave 02.12.2016 / 16:16

0 respostas