utilisez sed ou awk pour supprimer une chaîne d'une colonne particulière où le début et la fin de la chaîne sont connus

0

mon fichier contient des lignes comme celle-ci:

1 10241 rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP

Je voudrais tout supprimer de la colonne 4 commençant par POS et se terminant par GINFO =

Je pense que cela peut fonctionner: sed -e 's/POS=.*;GINFO=//‘ file > new_file

Si tout va bien, comment puis-je le diriger vers la colonne 4 en particulier?

Gordon Daly
la source

Réponses:

0

Pour adresser directement la 4ème colonne, utilisez l’ awkapproche suivante :

awk '{ sub(/^POS.*GINFO=/, "", $4) }1' file > new_file
  • $4 - pointe vers le 4ème champ
  • sub(/^POS.*GINFO=/, "", $4)- substitue une sous-chaîne donnée par pattern /^POS.*GINFO=dans le 4ème champ
RomanPerekhrest
la source
0

si vous voulez parler de colonnes et connues séparées par un espace, faites comme suit:

sed -E 's/^(([^ ]* ){3})POS=.*;GINFO=/\1/' infile

Cela ^(([^ ]* ){3})correspond à partir de la mendicité de la ligne ^pour tout ce qui *n'est pas un espace [^ ]jusqu'à un premier espace vu et le répéter pour un {3}temps maximum ; Les parenthèses font de cette correspondance une correspondance de regroupement avec une référence arrière \1dont nous revenons plus tard en pièce de remplacement s/pattern/replace/.

Cela (...)POS=.*;GINFO=correspond également à ce qui est POS=suivi par tout .*ce que vous voyez jusqu'à ce ;GINFOque cela soit supprimé

Pour les exemples de données donnés ci-dessous:

1 10241 POS=rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP
1 POS=10241 rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP
POS=1 10241 rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP

Retournera un résultat:

1 10241 POS=rs960927773 DDX11L1:100287102;R5;ASP
1 POS=10241 rs960927773 DDX11L1:100287102;R5;ASP
POS=1 10241 rs960927773 DDX11L1:100287102;R5;ASP

La version POSIXly pourrait être:

sed 's/^\([^ ]* \)\([^ ]* \)\([^ ]* \)POS=.*;GINFO=/\1\2\3/' infile
αғsнιη
la source
0

Dans POSIXly sed, nous pouvons faire ceci:

sed -ne '
   #place a markholder at the beginning of the 4th field
   s/[^[:blank:]][[:blank:]]\{1,\}/&\
/3

   # perform the sub on the 4th field
   s/\nPOS=.*;GINFO=//p
'  input_file
Rakesh Sharma
la source