Input:
sed 's%/\bta:/b[^ ]*%%g' output.txt
Sortie souhaitée:
bta01524 BIRC3 bta01522 FOS bta01522 IGF1R
J'ai essayé le code suivant, mais je n'ai pas pu supprimer le bta:
bta01524 Platinum drug resistance - Bos taurus (cow) (1) bta:514386 BIRC3 bta01522 Endocrine resistance - Bos taurus (cow) (2) bta:280795 FOS bta:281848 IGF1R
3 Réponses :
Si la ligne ne commence pas par un espace ( / ^ [^] /
), enregistrez la première colonne dans la variable save
. Si la ligne commence par un espace ( / ^ /
) et contient des colonnes ( NF! = 0
), imprimez la variable save
et le contenu de la colonne 2 .
bta01524 BIRC3 bta01522 FOS bta01522 IGF1R
Résultat:
awk '/^[^ ]/ {save=$1}; /^ / && NF!=0 {print save,$2}' file
En plus de sed
, awk
peut fournir une solution intéressante à votre problème, par exemple
$ awk '/^\w/{lbl=$1;next} NF>1{print lbl,$NF}' file bta01524 BIRC3 bta01522 FOS bta01522 IGF1R
Explication fort>
/ ^ \ w {lbl = $ 1; next}
si le premier caractère est un \ w
(caractère de mot), définissez le libellé ( lbl
) dans le premier champ et obtenir l'enregistrement next
; NF> 1 {print lbl, $ NF}
si le nombre de champs ( NF
) est supérieur à 1, imprimer l'étiquette et le dernier champ . ( remarque: le raccourci mot-caractère '\ w'
nécessite GNU awk et équivaut à [a-zA-Z0- 9_]
)
Exemple d'utilisation / de sortie
Utilisation de votre entrée dans fichier
,
XXX
Merci @EdMorton. Je n'y ai même pas pensé jusqu'à ce que tu l'aies compris.
Cela pourrait fonctionner pour vous (GNU sed):
sed -En '/^\S/h;//d;G;s/^.*\s(\S+)\n(\S+).*/\2 \1/p' file
Si la ligne actuelle commence par un espace non blanc, faites une copie dans l'espace d'attente, puis supprimez-la. Sinon, ajoutez l'espace de maintien à la ligne actuelle et en utilisant la correspondance de modèle et les références arrière, façonnez le format souhaité. En cas de succès, imprimez le résultat.
N.B. L'option -n
est définie pour empêcher l'impression normale et reproduire une nature de type grep .
Par
sauts de ligne nuls
, voulez-vous dire des lignes vides ou autre chose?