Comment supprimer n caractères d’une colonne spécifique en utilisant sed / awk / perl

J’ai les données suivantes délimitées par des tabulations:

chr1 3119713 3119728 MA05911Bach1Mafk 839 + chr1 3119716 3119731 MA05011MAFNFE2 860 + chr1 3120036 3120051 MA01502Nfe2l2 866 + 

Ce que je veux faire est de supprimer 7 caractères de la 4ème colonne. Résultant en

 chr1 3119713 3119728 Bach1Mafk 839 + chr1 3119716 3119731 MAFNFE2 860 + chr1 3120036 3120051 Nfe2l2 866 + 

Comment puis je faire ça? Notez que la sortie doit également être séparée de TAB.

Je suis coincé avec le code suivant, qui remplace de la première colonne, que je ne veux pas

 sed 's/^.\{7\}//' myfile.txt 

  awk '{ $4 = substr($4, 8); print }' 
 perl -anE'$F[3] =~ s/.{7}//; say join "\t", @F' data.txt 

ou

 perl -anE'substr $F[3],0,7,""; say join "\t", @F' data.txt 

Avec sed

 $ sed -E 's/^(([^\t]+\t){3}).{7}/\1/' myfile.txt chr1 3119713 3119728 Bach1Mafk 839 + chr1 3119716 3119731 MAFNFE2 860 + chr1 3120036 3120051 Nfe2l2 866 + 
  • -E utilise des expressions régulières étendues, pour éviter d’avoir à utiliser \ for (){} . Certaines versions sed peuvent avoir besoin de -r au lieu de -E
  • ^(([^\t]+\t){3}) capturer les trois premières colonnes, facile de changer le nombre de colonnes si nécessaire
  • .{7} caractères à supprimer de la 4ème colonne
  • \1 les colonnes capturées
  • Utilisez l’option -i pour l’ édition sur place

Avec perl vous pouvez utiliser \K pour lookbehind positif de longueur variable

 perl -pe 's/^([^\t]+\t){3}\K.{7}//' myfile.txt