Imprimer chaque ligne, mais uniquement conditionnellement, des fragments pour certaines lignes

1

J'ai un fichier texte qui ressemble à ceci:

   rno-miR-344-5p
   miRPlus_11239/mmu-miR-383/rno-miR-383
   hsa-miR-301a/mmu-miR-301a/rno-miR-301a
   hsa-miR-199a-3p/hsa-miR-199b-3p/mmu-miR-199a-3p/mmu-miR-199b/rno-miR-199a-3p
   Empty
   Hy3
   rno-miR-1

   rno-miR-598-5p
   spike_control_h

   Empty

Je voudrais imprimer chaque ligne. MAIS pour les lignes qui contiennent par exemple hsa-miR-301a / mmu-miR-301a / rno-miR-301a Je voudrais imprimer uniquement la partie rno-miR-etc.

J'ai essayé de faire cela avec awk mais je suis sorti de ma profondeur.

duff
la source

Réponses:

2

en supposant que la barre oblique n'apparaisse que sur les lignes que vous ciblez:

awk -F/ '{print $NF}' file

n’imprimera que le dernier champ séparé par une barre oblique. Sur les lignes sans barre oblique, le champ 1 est également le dernier.

Si vous ciblez spécifiquement les lignes commençant par hsa-miR, puis:

awk -F/ '/^hsa-miR/ {print $NF; next} {print}' file
glenn jackman
la source
Génial, votre première solution est parfaite. Pourriez-vous s'il vous plaît expliquer?
duff
Je pensais l'avoir fait. le -F option définit le séparateur de champ. le NF variable est le nombre de champs. le $ opérateur se réfère à la valeur du numéro de champ donné.
glenn jackman
En effet vous l'avez fait. Après avoir posté, je me suis dit: "Comme je suis paresseux!" et est allé voir ce que NF a fait. Merci encore.
duff