-2
votes

Comment puis-je modifier une valeur dans une colonne si cette ligne contient un mot spécifique utilisant SED / AWK ou BASH tout en conservant le blanchiment?

J'ai un PDB qui ressemble à: xxx

Je veux modifier la 11ème colonne en 1.0000 si une ligne contient ATOM CA et enregistrer ces modifications dans le même fichier.

Comment puis-je faire cela à l'aide de SED, AWK ou BASH afin que je garde le même espacement entre les colonnes? Merci


5 commentaires

Veuillez mentionner vos efforts dans votre question et laissez-nous savoir alors.


Eh bien, j'ai utilisé AWK '$ 1 == "CA4" {$ 4 = "1.0000"} 1' fichier, mais je ne reçois pas le même espace entre les colonnes. Je ne sais pas comment obtenir exactement le même espacement entre les deux.


J'ai réussi à le faire avec SED, mais au cas où quelqu'un est prêt à écrire comment le faire avec Bash et / ou Awk, je serais reconnaissant! Merci


Qu'est-ce que cela signifie garder le même espacement entre les colonnes lorsque vous modifiez la largeur d'un champ? Si foo 40,00 bar devient foo 1,00000 bar ou ou ou ou ou ou FOO 1.00000 bar ou foo 1.00000 bar ou quelque chose d'autre? Modifier Votre question à afficher la sortie attendue étant donné votre entrée d'échantillon affichée.


Unix.stackexchange.com/questions/ 239218 / ...


4 Réponses :


0
votes

awk fera le travail. xxx

Google awk Pour plus d'informations, car il s'agit d'un outil de base qui mérite d'apprendre

supposer des colonnes de largeur fixe, conformément au commentaire ci-dessous, le Le script AWK peut être modifié pour spécifier des whiddths. Les valeurs doivent être vérifiées, comme une question non claire sur les largeurs exactes. xxx


4 commentaires

Merci et comment puis-je garder le même espacement entre les colonnes?


Je ne connais pas le format PDB. On dirait que l'espace séparé, mais je ne suis pas sûr. Quelles sont les exigences - comment les champs sont définis?


Atom 3 CA A 2 1 223.640 180.497 152.816 1,00 40,00 O Fondamentalement, dans Python, j'aurais l'analyse suivante: Si la ligne.Start -swith ("atome"): atom_id = ligne [4:11]. () Atom_type = ligne [11 : 16] float (ligne [38:46]) cartn_z = flotteur (ligne [46:54]) etc. Je ne sais tout simplement pas ce qui serait équivalent à Awk. :)


Envisagez de poster le commentaire sur le format du fichier. Ce n'est pas courant aujourd'hui d'avoir des fichiers de données de largeur fixe. La plupart des réponses assument des fichiers distincts spatiaux. En outre, cela aide beaucoup d'entre vous après l'échantillon de sortie.



0
votes

sed -e '/ ca / ​​s / [^] + / 1.000 / 11' Fichier

(GNU SED, supposant des espaces et non des onglets)

Ceci utilise 11 après le remplacement pour remplacer le 11ème mot. Le remplacement ne se produit que sur les lignes correspondant / ca / ​​

-e est requis pour le + fonctionner comme prévu.

Vous voudrez peut-être adapter la chaîne de blanchiment ou de remplacement à vos besoins exacts. Depuis que cela n'affecte que la 11ème colonne, vous pouvez faire exactement ce que vous voulez.


2 commentaires

Merci beaucoup! Puis-je demander au cas où vous auriez des onglets, ce qui changerait dans la commande?


Quelque chose comme ceci sed -e '/[[[ .[[[[ .[kace:]/s/[^[.space:]]+/1.0000/11' - semble travailler si je fais séparer votre échantillon d'échantillon.



0
votes

La commande suivante SED forte> SED fonctionnera:

X="[^ ]\+ \+"; sed "/ CA /{:a;s/\($X$X$X$X$X$X$X$X$X$X\)\([^ ]\+\)[^ ] /\1\2  /;ta}"


0 commentaires

0
votes

Si vous SAVOIR EM> que la 11ème colonne est toujours de 16 caractères de large, la commande SED STR> PRE> XXX PRE>

donnera: xxx pré>

explication: sur lignes avec le jeton ca code>, ceci remplace la 11ème colonne avec 1.0000 code> suivi de 10 espaces.

avec certaines versions de SED forts>, vous devrez peut-être remplacer \ + code> avec \ {1, \} code>, comme dans : p>

sed -i '/ CA /s/\(.\{61\}\).\{16\}/\11.0000          /' filename


0 commentaires