2017-07-17 1 views
0

J'ai des fichiers xxx.pdb comme:maintien du format de fichier PDB après l'édition.

ATOM 1910 CB SER 128  45.806 50.621 39.840 1.00 9.36 
ATOM 1913 OG SER 128  44.538 51.195 39.571 1.00 9.36 
ATOM 1915 C SER 128  45.325 48.172 40.360 1.00 9.36 
ATOM 1916 O SER 128  45.368 47.955 39.155 1.00 9.36 
ATOM 1917 N SER 129  44.953 47.236 41.238 1.00 11.24 
ATOM 1919 CA SER 129  44.395 45.938 40.826 1.00 11.24 
ATOM 1921 CB SER 129  44.091 45.053 42.031 1.00 11.24 
ATOM 1924 OG SER 129  43.483 45.786 43.085 1.00 11.24 

Quand j'ai essayé ce code: awk '{if (10 < 11 $) {$ 9 = "1.50"}; print $ 0}' xxx.pdb

Cela est arrivé:

ATOM 1910 CB SER 128 45.806 50.621 39.840 1.50 9.36 
ATOM 1913 OG SER 128 44.538 51.195 39.571 1.50 9.36 
ATOM 1915 C SER 128 45.325 48.172 40.360 1.50 9.36 
ATOM 1916 O SER 128 45.368 47.955 39.155 1.50 9.36 
ATOM 1917 N SER 129  44.953 47.236 41.238 1.00 11.24 
ATOM 1919 CA SER 129  44.395 45.938 40.826 1.00 11.24 
ATOM 1921 CB SER 129  44.091 45.053 42.031 1.00 11.24 
ATOM 1924 OG SER 129  43.483 45.786 43.085 1.00 11.24 

Toute idée sur la façon de conserver la mise en forme de colonne?

Merci.

+0

Quel est l'espace blanc entre les champs - caractères à une seule tabulation ou séquences de caractères vierges ou une combinaison de chacun ou quelque chose d'autre? Avez-vous vraiment des blancs avant le début de chaque ligne ou est-ce une faute de frappe dans votre message? –

Répondre

0
awk 'BEGIN{FS=OFS="\t";}{if($10<11){$9="1.50"};print $0}' xxx.pdb 

utiliser la tabulation comme délimiteur d'entrée et de sortie.

0

Si perl est correct

$ perl -ape 's/\S+(?=\s+\S+$)/1.50/ if $F[-1]<11' xxx.pdb 
ATOM 1910 CB SER 128  45.806 50.621 39.840 1.50 9.36 
ATOM 1913 OG SER 128  44.538 51.195 39.571 1.50 9.36 
ATOM 1915 C SER 128  45.325 48.172 40.360 1.50 9.36 
ATOM 1916 O SER 128  45.368 47.955 39.155 1.50 9.36 
ATOM 1917 N SER 129  44.953 47.236 41.238 1.00 11.24 
ATOM 1919 CA SER 129  44.395 45.938 40.826 1.00 11.24 
ATOM 1921 CB SER 129  44.091 45.053 42.031 1.00 11.24 
ATOM 1924 OG SER 129  43.483 45.786 43.085 1.00 11.24 
  • \S+(?=\s+\S+$) utilise préanalyse positif pour correspondre à la dernière, mais un champ
    • utilisation \S+(?=\s+\S+\s*$) s'il peut y avoir-espaces blancs à la fin de la ligne
  • $F[-1]<11 vérifier la condition si le dernier champ est inférieur à 11
  • Voir http://perldoc.perl.org/perlrun.html#Command-Switches pour plus de détails sur les options -ape. L'option -a sera automatiquement divisée ligne d'entrée sur l'espace et enregistrez @F tableau
0

Avec awk GNU gensub():

$ awk '$NF<11{$0=gensub(/\S+(\s+\S+)$/,"1.50\\1",1)}1' file 
ATOM 1910 CB SER 128  45.806 50.621 39.840 1.50 9.36 
ATOM 1913 OG SER 128  44.538 51.195 39.571 1.50 9.36 
ATOM 1915 C SER 128  45.325 48.172 40.360 1.50 9.36 
ATOM 1916 O SER 128  45.368 47.955 39.155 1.50 9.36 
ATOM 1917 N SER 129  44.953 47.236 41.238 1.00 11.24 
ATOM 1919 CA SER 129  44.395 45.938 40.826 1.00 11.24 
ATOM 1921 CB SER 129  44.091 45.053 42.031 1.00 11.24 
ATOM 1924 OG SER 129  43.483 45.786 43.085 1.00 11.24 

Le ci-dessus fonctionnera, peu importe ce que l'espace blanc est entre les champs (onglets, blancs, peu importe ...).