Regex remplacer sur une colonne spécifique avec SED / AWK

J’ai des données qui ressemblent à ceci (délimité par des tabulations):

Organ K ClustNo Analysis LN K200 C12 Gene Ontology LN K200 C116 Gene Ontology CN K200 C2 Gene Ontology 

Ce que je veux faire, c’est supprimer C pour chaque ligne de la 3ème colonne , sauf la ligne d’en-tête:

 Organ K ClustNo Analysis LN K200 12 Gene Ontology LN K200 116 Gene Ontology CN K200 2 Gene Ontology 

Cela ne se fera pas car cela affectera les autres colonnes et la ligne d’en-tête:

 sed 's/C//' 

Quelle est la bonne façon de le faire?

Utiliser awk

awk est un bon outil pour cela:

 $ awk -F'\t' -v OFS='\t' 'NR>=2{sub(/^C/, "", $3)} 1' file Organ K ClustNo Analysis LN K200 12 Gene Ontology LN K200 116 Gene Ontology CN K200 2 Gene Ontology 

Comment ça marche

  • -F'\t'

    Utilisez l’onglet comme séparateur de champ en entrée.

  • -v OFS='\t'

    Utilisez l’onglet comme délimiteur de champ en sortie

  • NR>=2 {sub(/^C/, "", $3)}

    Supprimez le C initial du champ 3 uniquement pour les lignes après la première ligne.

  • 1

    C’est le raccourci crypté de awk pour imprimer la ligne.

Utiliser sed

 $ sed -r '2,$ s/(([^\t]+\t+){2})C/\1/' file Organ K ClustNo Analysis LN K200 12 Gene Ontology LN K200 116 Gene Ontology CN K200 2 Gene Ontology 
  • -r

    Utilisez des expressions régulières étendues. (Sur Mac OSX ou une autre plate-forme BSD, utilisez plutôt -E .)

  • 2,$ s/(([^\t]+\t){2})C/\1/

    Cette substitution est uniquement appliquée aux lignes de 2 à la fin du fichier.

    (([^\t]+\t){2}) correspond aux deux premières colonnes séparées par des tabulations. Cela suppose qu’un seul onglet sépare chaque colonne. Comme le regex est entouré de parens, ce qu’il correspond sera disponible ultérieurement sous la forme \1 .

    C cette correspondance C

    \1 remplace le texte correspondant par les deux premières colonnes, pas le C ..