À l'aide de sed ou VIM pour remplacer l'espace avec une nouvelle ligne
J'ai les données suivantes.
1455931_at Chrna3 1420468_at Asb17 1445520_at −−− 1436717_x_at Hbb−y 1431788_at Fabp12 1458975_at −−−
Avec sed
ou de l'éditeur VIM comment puis-je le changer pour
1455931_at Chrna3
1420468_at Asb17
1445520_at −−−
1436717_x_at Hbb−y
1431788_at Fabp12
1458975_at −−−
De sorte que tout le mot qui a _at
sera le premier de chaque ligne.
Chaque ligne se composent de deux à deux _a et le gène de termes.
OriginalL'auteur pdubois | 2013-12-11
Vous devez vous connecter pour publier un commentaire.
Dans Vim, je ferais ceci:
Où la
^M
est tapé sur les touches ctrl-V (contrôle Q sur Windows), suivi par la touche Entrée/Retour.Cela suppose des espaces simples entre les jetons; @Floris l'indique, vous pouvez utiliser
s/\+/^M/g
à son tour plusieurs espaces consécutifs en un seul saut de ligne. Ou vous pourriez utilisers/\v\s+/^M/g
à faire la même chose avec n'importe quel des espaces consécutifs, y compris les onglets ainsi que des littérale des caractères d'espace.%s/ \+/^M/g
pour la première commande? Il prend soin de les espaces superflus.OriginalL'auteur Mark Reed
Incroyable mais vrai:
En d'autres termes, la
sed
chaîne que j'ai utilisé avait un physique de retour de chariot (le>
a été ajouté par la console):Vous pourriez expérimenter un peu avec d'autres expressions (je suis en train hypothèse d'équilibre paires, mais si vous voulez faire correspondre la
at
à la fin de la première chaîne vous pourriez).:'<,'>!sed sed 's/\([^ ]*\) \(.[^ ]* \)/\1 \2\ ENTER
, mais a échoué avant d'ajouter/g'
En bash ou autre shell POSIX, vous pouvez également profiter de POSIX cordes et le type que
$'...\\\n/g'
trois barres obliques inverses pour le retour à la ligne? Pouvez-vous expliquer? S'il vous plaît?
est transformé par le shell dans le même ordre que dans votre réponse: un antislash suivi d'un saut de ligne;
sed
ne peut pas faire la différence. Dans une chaîne de caractères POSIX$'...'
,\\
devient un antislash et\n
devient une nouvelle ligne, afin de les mettre ensemble, vous obtenez\\\n
pour la barre oblique inverse + retour à la ligne.OriginalL'auteur Floris
À l'aide de sed:
s//\n/g; s/_at\n/_at /g
Il y a peut être une solution plus élégante, mais celle-ci fera.
sed
(Mac OS) sur le\n
n'est pas reconnu.OriginalL'auteur aragaer
pour votre exemple,
OriginalL'auteur henices
Cela permet tout "espace" comme séparateur et dans un ou plusieurs occurence, n \n sur la dernière ligne. Cette prise 1 "mot" après toute portion de chaîne terminée par
_at
, pas d'alternance de parole (interprétation de mon côté).Ce n'évite pas l'2 "_a" à écrire sur 2 lignes distinctes (cas, il y a un manquant/mot vide de sens)
OriginalL'auteur NeronLeVelu
Voici un
awk
solution:Ce imprime deux et deux champs.
Une autre version:
OriginalL'auteur Jotne
Vous pouvez l'utiliser pour trouver toutes les 2-paires de mots où le premier mot se termine par "_a"
ou, pour le dire d'un retour à la ligne après chaque 2ème mot:
OriginalL'auteur glenn jackman