J'ai un PDB qui ressemble à: 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. P> Comment puis-je faire cela à l'aide de SED, AWK ou BASH afin que je garde le même espacement entre les colonnes?
Merci p> p>
4 Réponses :
awk fera le travail. Google 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. P> awk code> Pour plus d'informations, car il s'agit d'un outil de base qui mérite d'apprendre p>
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.
(GNU SED, supposant des espaces et non des onglets) P>
Ceci utilise 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. P> sed -e '/ ca / s / [^] + / 1.000 / 11' Fichier CODE> P>
11 code> après le remplacement pour remplacer le 11ème mot. Le remplacement ne se produit que sur les lignes correspondant
/ ca / code> p>
-e code> est requis pour le
+ code> fonctionner comme prévu. p>
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' code> - semble travailler si je fais séparer votre échantillon d'échantillon.
La commande suivante X="[^ ]\+ \+"; sed "/ CA /{:a;s/\($X$X$X$X$X$X$X$X$X$X\)\([^ ]\+\)[^ ] /\1\2 /;ta}"
Si vous SAVOIR EM> que la 11ème colonne est toujours de 16 caractères de large, la commande donnera: explication: sur lignes avec le jeton avec certaines versions de SED forts>, vous devrez peut-être remplacer ca code>, ceci remplace la 11ème colonne avec
1.0000 code> suivi de 10 espaces.
\ + code> avec
\ {1, \} code>, comme dans : p>
sed -i '/ CA /s/\(.\{61\}\).\{16\}/\11.0000 /' filename
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 code> lorsque vous modifiez la largeur d'un champ? Si
foo 40,00 bar code> devient
foo 1,00000 bar code> ou
ou
ou
ou
ou
ou
FOO 1.00000 bar code> ou
foo 1.00000 bar code> 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 / ...