web-dev-qa-db-fra.com

Quelle commande LINUX utiliser pour la tâche 'Couper et remplacer une colonne'?

http://paste.ubuntu.com/24184546/

Ceci est le fichier. Ici, je dois remplacer la 6ème colonne par des chiffres de 1 à 158 respectivement.

Le résultat devrait ressembler à http://paste.ubuntu.com/24184581/

Comment puis-je le faire, en utilisant les commandes linux? Merci d'avance.

2
User

Ce que vous demandez, en gros, consiste à incrémenter un compteur chaque fois que la colonne 4 change. La commande awk ci-dessous fait exactement cela.

$ awk '$4 != last{count++};{$6=count;last=$4};1' input.txt                                     
ATOM 1149 N MET B 1 56.923 131.264 45.113 1.00140.13 N
ATOM 1150 CA MET B 1 58.169 131.437 44.333 1.00140.13 C
ATOM 1151 C MET B 1 58.225 130.444 43.220 1.00140.13 C
ATOM 1152 O MET B 1 58.569 130.785 42.089 1.00140.13 O
ATOM 1153 CB MET B 1 59.401 131.239 45.231 1.00140.13 C
ATOM 1154 CG MET B 1 59.536 129.826 45.799 1.00140.13 C
ATOM 1155 SD MET B 1 58.315 129.397 47.077 1.00140.13 S
ATOM 1156 CE MET B 1 59.098 130.370 48.397 1.00140.13 C
ATOM 1157 N SER B 2 57.860 129.183 43.517 1.00 86.33 N
ATOM 1158 CA SER B 2 57.898 128.164 42.517 1.00 86.33 C
ATOM 1159 C SER B 2 56.887 128.522 41.486 1.00 86.33 C
ATOM 1160 O SER B 2 55.901 129.195 41.780 1.00 86.33 O
ATOM 1161 CB SER B 2 57.559 126.761 43.047 1.00 86.33 C
ATOM 1162 OG SER B 2 56.212 126.721 43.495 1.00 86.33 O
ATOM 1163 N ALA B 3 57.122 128.084 40.237 1.00 45.56 N
ATOM 1164 CA ALA B 3 56.217 128.412 39.183 1.00 45.56 C
ATOM 1165 C ALA B 3 55.730 127.143 38.568 1.00 45.56 C
ATOM 1166 O ALA B 3 56.393 126.109 38.624 1.00 45.56 O
ATOM 1167 CB ALA B 3 56.865 129.235 38.059 1.00 45.56 C

Théorie de fonctionnement

Chaque commande awk peut être structurée de la manière suivante:

awk '/Condition/ {code block to run on condition};'

Si la condition est manquante, le bloc de code est exécuté pour n'importe quelle ligne, quel que soit son contenu. Dans cet exemple, nous vérifions si le champ $4 (colonne) a changé ($4 != last, se lit comme champ 4 et n’est pas égal à la variable last). Si la condition est vraie (ce qui sera à chaque fois qu'elle change et sur la première ligne, quand la dernière n'est pas encore définie), nous incrémentons la variable count.

Le prochain bloc de code {$6=count;last=$4} sera exécuté quelle que soit la ligne sur laquelle nous nous trouvons. Nous affectons simplement le contenu de la variable count au champ 6 et enregistrons ce que nous avons vu dans le champ 4. La variable count commencera à exister lorsque le script aura rencontré la première ligne du texte et sera créée lors de la commande évalue la partie $4 != last. last, par contre, verra le jour lorsque le code évaluera la partie {$6=count;last=$4}.

Enfin, 1 à la fin est simplement une astuce à conditionner pour toujours évaluer à "true" et imprimer. Juste un raccourci au lieu du bloc {print}.

Pour enregistrer le résultat dans un fichier, utilisez l'opérateur > Shell afin de rediriger la sortie dans Shell. Par exemple

awk '$4 != last{count++};{$6=count;last=$4};1' input.txt > output.txt
2