Commandline Tips : Extraction du x‑ième champ d'un fichier organisé en colonne

But : Dans un fichier orga­ni­sé en colonne, extraire la (ou les) colonne(s) qui nous inté­ressent

Pré­re­quis : Savoir uti­li­ser grep est un plus.

Dif­fi­cul­té : 1/​5 (Facile)

Nous sou­hai­tons dans le fichier PDB 6CSC  extraire la pre­mière et la qua­trième colonne des lignes débu­tant par le mot clef "ATOM"

Pré­pa­ra­tion des don­nées :

La pre­mière chose à faire est d'extraire les lignes conte­nant avec mot clef "ATOM", pour cela nous allons uti­li­ser grep. L'utilisation la plus simple de cet uti­li­taire demande deux argu­ments qui sont la chaîne recher­chée et le fichier à fouiller.

Le lec­teur atten­tif aura remar­qué que des guille­mets sont pré­sents et qu'un espace a été rajou­té. Les deux sont liés, lorsque nous fil­trons sur le mot clef seul, grep nous ren­voient des ligne de com­men­taires conte­nant le mot ATOMS que nous ne sou­hai­tons pas. Les lignes qui nous inté­ressent contiennent le mot clef immé­dia­te­ment sui­vit d'un espace et l'espace nous oblige à rajou­ter des guille­mets. Une autre solu­tion aurait pu être : grep ATOM 6CSC.pdb | grep ‑v ATOMS  l'option "-v" per­met­tant de sélec­tion­ner toutes les lignes qui ne contiennent pas le mot clef, le carac­tère | (dit pipe) il sera expli­qué plus loin.

Voi­ci un extrait du résul­tat des deux com­mandes :

Com­mande : Awk
Nous allons main­te­nant pas­ser à la sélec­tion de la pre­mière et qua­trième colonne. Nous allons uti­li­ser l'utilitaire awk dans son usage le plus basique, l'exemple ci-des­sus ne nous per­met pas d'utiliser la com­mande cut, j'en par­le­rai tout de même à la fin de l'article.

Le carac­tère "|" signi­fie pipe, il prend le résul­tat de la com­mande à sa gauche pour l'envoyer comme "fichier" d'entrée à la com­mande à sa droite. Tout étant fichier sous GNU/​Linux, ceci est fait de manière trans­pa­rente.

L'argument pas­sé à awk, qui à son propre lan­gage de pro­gram­ma­tion, est le sui­vant ' { print $1, $4 } '

  • Ce que nous avons pla­cé entre guille­met simple est le script qui va être exé­cu­té, nous aurions aus­si pu uti­li­ser l'option ‑f file­name et sto­cker le script dans un fichier.
  • $1 et $4 sont res­pec­ti­ve­ment le conte­nu des colonnes 1 et 4, par défaut awk uti­lise l'espace comme sépa­ra­teur, qu'il y en ait un ou plu­sieurs, c'est la même chose.
  • Les acco­lades déli­mitent ce qui est appe­lé un "bloc-pro­gramme" qui regroupe un ensemble de trai­te­ment à effec­tuer.
  • La vir­gule per­met lors de l'affichage, fait avec la fonc­tion print, de sépa­rer avec un espace la pre­mière et la qua­trième colonne.

Quelques infor­ma­tions sup­plé­men­taires :

  • $0 per­met d'afficher la ligne entière
  • L'option ‑F per­met de défi­nir le déli­mi­teur, un exemple est pré­sent à la fin de cet article

Com­mande : cut

Je sou­haite main­te­nant faire la même chose avec l'utilitaire cut, celui ci n'a pas la plas­ti­ci­té d'awk et il est néces­saire que chaque colonne soit sépa­ré par un seul et unique déli­mi­teur. C'est pour­quoi j'ai repris le résul­tat de la pre­mière com­mande grep et rem­pla­cé les espaces entres les dif­fé­rents termes par des ":" (for­mat CSV pour les puristes). La manière de pro­cé­der au rem­pla­ce­ment sera expli­qué dans un pro­chain article.

Quelques expli­ca­tions : nous deman­dons à cut d'afficher les champs 1 et 4 (field option ‑f) déli­mi­té par le sépa­ra­teur ";" (deli­mi­ter option ‑d).

Comme tou­jours , il est pos­sible d'obtenir le même résul­tat de plu­sieurs façons :

 Liens

 



Pour continuer la lecture :


Commentaires

7 réponses à “Commandline Tips : Extraction du x‑ième champ d'un fichier organisé en colonne”

  1. Le sépa­ra­teur uti­li­sé dans le cut (cut ‑d ";" ‑f 1,4 6CSC.csv) ne devait pas plu­tôt être ':' au lieu de ';' ?

    1. Avatar de Leo_01

      Bien sur ! Cor­rec­tion effe­cu­tée

  2. Il aurait été pos­sible de se pas­ser de grep car awk peut fil­ter les lignes tout seul
    awk ' $1=="ATOM" { print $1, $4 } '

    1. Avatar de Leo_01

      Effec­ti­ve­ment, pour intro­duire un outil sup­plé­men­taire mon choix s'est por­té sur grep. Mais aux vues des pos­si­bi­li­tés offertes par awk, je pense faire un article plus large sur cet outil, j'en par­le­rai à ce moment là.

  3. Ca, c'est un super article mémo, j'oublie à chaque fois com­ment faire 😀

  4. Pou­vez-vous expli­quer com­ment vous faites pour rem­pla­cer les espaces entre les dif­fé­rents termes par ":" ?

    1. Il doit s'agir de la com­mande Sed sui­vante :

      cat mon­Fi­chier | sed "s/​ /:/g" > mon­Nou­veau­Fi­chier

Laisser un commentaire