2012-08-01 4 views
2

Je ne suis pas du tout familier avec Vim mais je travaille avec de gros fichiers texte (~ 1G) et mes éditeurs de texte standard ne le coupaient pas.Comment ajouter une troisième ligne dans Vim?

Mes fichiers sont actuellement dans ce format:

Arbitrary_title_of_sequenceA 
SEQ1SEQ1SEQ1SEQ1 
SEQ2SEQ2SEQ2SEQ2 
Arbitrary_title_of_sequenceB 
SEQ1SEQ1SEQ1SEQ1 
SEQ2SEQ2SEQ2SEQ2 

je besoin d'un moyen pratique de annexant la ligne « SEQ2 » à la ligne « SEQ1 » comme ceci:

Arbitrary_title_of_sequenceA 
SEQ1SEQ1SEQ1SEQ1SEQ2SEQ2SEQ2SEQ2 
Arbitrary_title_of_sequenceB 
SEQ1SEQ1SEQ1SEQ1SEQ2SEQ2SEQ2SEQ2 

Compte tenu de la taille de ces fichiers, faire chaque ligne séparément n'est pas vraiment une option. Toute aide serait très appréciée!

Répondre

1
:1,$s/\(.*\n\)\(.*\)\n\(.*\n\)/\1\2\3/ 

1,$   -> range is all file 
s/PAT1/PAT2/ -> substitute PAT1 with PAT2 
.*   -> match any character except new line 
\n   -> match new line 
\(PAT1\)  -> capture/remember the string that matched PAT1 
\1,\2,\3  -> refers to the captured string for captures in order 

également avec sed au lieu de vim devrait être plus rapide:

sed -i 'n;N;s/\n/ /' input_file 

Cela peut se résumer comme:

Read a line 
Read another line and print previous line (n) 
Read another line and append it to the previous line (N) 
find the first newline and change it to space (s/\n/ /) 
print the line (or merged lines) 
+0

La commande sed ne devrait pas être: 'sed -i 'n; N; s/\ n //' fichier_entrée'. Notez le 's/\ n //', afin de ne pas laisser d'espace entre les lignes fraîchement jointes. –

2

Qu'en est-il de fournir un échantillon correct pour commencer?

:g/SEQ1/norm Jx 

fait ce que je pense que vous voulez.

  • :g/SEQ1 est la commande :global qui vous permet d'agir sur chaque ligne contenant le motif SEQ1. Voir :help :global.
  • norm est la commande :normal que vous utilisez pour exécuter une commande de mode normal, ici sur chaque ligne correspondant à :g/SEQ1. Voir :help :normal.

Ensuite vient la commande normale en question:

  • J est utilisé pour joindre la ligne courante avec la ligne ci-dessous.
  • est utilisé pour supprimer le <Space> automatiquement ajouté par Vim.
+3

Temps de golf Vim: ': g/SEQ1/j!'. ': j' est l'abréviation de': join' qui est la commande ex pour joindre des lignes. Le '!' Signifie que ': join' n'insèrera ou ne supprimera aucun espace.voir ': h: j' pour plus d'aide –

+2

En fonction de laquelle des trois sortes de lignes est plus facile de faire correspondre un motif, en plus de': g/SEQ1/j! ', considérons aussi': g/SEQ2/-j! ' et ': g/title/+ j!'. Notez que ces trois commandes sont les plus efficaces par rapport aux substitutions ou aux commandes en mode Normal. –

+0

Vous les gars rock. Ma réponse initiale était basée sur l'appariement de 'SEQ2' mais je pensais qu'il était plus efficace de faire correspondre' SEQ1'. – romainl

0

Je pense que la solution de romainl est le meilleur si vous avez un modèle « SEQ1 » fiable, vous pouvez accrocher. Dans le cas contraire et vous souhaitez rejoindre littéralement chaque troisième ligne, vous pouvez facilement le faire avec une macro:

qqjJxjq 

Hit G pour voir combien de lignes sont dans le fichier et il suffit de répéter la macro que plusieurs fois (il doesn Peu importe que ce soit plus élevé que ce dont vous avez besoin. Donc, si le fichier était de 1000 lignes, vous pouvez faire [email protected]. Ce type de solution est facile à retenir et à intégrer dans votre flux de travail normal.

Questions connexes