2009-04-24 7 views
3

J'ai plusieurs lignes que je voudrais diviser en deux colonnes et obtenir les données de chaque colonne. Les données ressemble à ceci:Aligner les colonnes dans le VI

current_well.well_number 
current_well.well_name 
current_well.well_type_code 
well_location.section 
well_location.range 

Essentiellement ce que je voudrais faire est de diviser la ligne à base hors de la période, transformer les données en deux colonnes, puis saisir les données pour chaque colonne. Je sais que cela peut être fait dans Excel, mais je suis vraiment intéressé par la solution VIs pour ce problème. Je sais que

%s/\./ 

mettra en forme la chaîne avec des espaces vides. Mais une fois que j'ai les données à la recherche comme:

current_well well_number 
current_well well_name 
current_well well_type_code 
well_location section 
well_location range 

Comment puis-je attraper toutes les valeurs pour chaque colonne afin que je puisse le coller dans une autre application?

Répondre

2

J'ai déjà rencontré ce problème un certain nombre de fois. Changer les points en onglets les alignera surtout agréable, mais pas vraiment. Il est vrai que toutes les colonnes vont commencer sur un tabstop, mais il n'y a aucune garantie qu'elles seront sur le même tabstop. Par exemple, si cela était votre texte original:

lt1tab.value1 
gt1tabstop.value2 

et vous faire:

%s/\./\t/g 

et en supposant un tabstop est de 8 places, vous obtiendrez:

lt1tab value1 
gt1tabstop value2 

Qu'est-ce que vous pourrait vouloir faire à la place est de supprimer tout sauf la dernière colonne (ou la colonne que vous voulez). Par exemple:

%s/^.*\.// 

vous laissera avec:

value1 
value2 

que vous pouvez facilement copier et coller.


Si vous ne devez pas utiliser Vim, vous pouvez utiliser de cut unix pour faire ce que vous voulez:

cut -f2 -d. input_file > output_file 
+0

Cela a bien fonctionné! Pour obtenir les valeurs à gauche de la période j'ai utilisé l'expression suivante: % s /\..*$// –

0

Une solution possible:

  1. w (ou W pour les mots) sauts au mot suivant,
  2. CTRL - RCTRL - W obtient le mot sous le curseur et pâtes en ligne de commande

Maintenant, vous devez enchaîner ces commandes dans une boucle puis les sortir à votre manière.

0

Pourquoi ne pas bloquer le mode visuel? C-v, sélectionnez ce que vous voulez, et collez-le dans une autre application. Pour ce genre de coller, vous devriez probablement mettre

:set guioptions+=a 

ainsi.

Hmm, maintenant que j'ai relu votre question. Demandez-vous comment diviser les données en colonnes ou comment les coller dans une autre application?


Je pense que je l'ai eu maintenant (3ème lecture). Faites comme vous avez fait et obtenez les espaces où les points étaient auparavant. Ensuite, faites une autre substitution, et remplacez les espaces par des tabulations, chaque onglet étant, 15 ou quelque chose. Il les alignera bien. Ensuite, vous pouvez sélectionner et les copier partout.

Vous pouvez également faire correspondre la regex pour sélectionner la deuxième colonne par exemple, mais bien qu'il s'allume comme un arbre de Noël, vous ne pourrez pas le tirer.

0

Vous pouvez sélectionner des colonnes dans gvim en tapant Ctrl-VCtrl-G ou Ctrl-QCtrl-G (selon si vous utilisez Windows insérer mappage des touches), puis en sélectionnant avec la souris.

0

Ctrl V sélectionne une colonne

+1

En fait, il sélectionne un bloc. Je n'ai pas encore trouvé un éditeur qui puisse sélectionner des colonnes de texte. – Rook

0

je convertir les points à onglets, alors le bloc de sélectionner chaque colonne:

:% s /\./ CtrlV-Tab/g

CtrlV pour ensuite bloquer sélectionner les colonnes. Ou, comme vous auriez des valeurs séparées par des tabulations, elles se colleront directement dans les colonnes dans Excel.

1

De toute évidence, les méthodes ci-dessus avec bloc de sélection et/ou Excel sont plus faciles. Mais je suis un masochiste et j'ai décidé de supposer que vous n'aviez accès à aucun d'entre eux et que vous essayez de le faire avec seulement des commandes vi. Voici l'horrible chose que j'ai imaginée:

Mon plan de base est de transformer la liste des colonnes jointes en deux listes, l'une après l'autre. Cela implique essentiellement de casser chaque ligne en deux lignes, puis de copier toutes les autres lignes jusqu'à la fin du fichier.

Alors, d'abord, nous devons briser chaque ligne en deux lignes avec cette commande:

:%s/\./^M/ 

Ensuite, oscillation par le bas du fichier et de créer une ligne vide, puis revenir à la première ligne. Cela aidera à la lisibilité plus tard.

Go[Esc] 
:1 

Maintenant, vous devez mapper la séquence suivante à votre clé préférée:

:map [Key] mkjddGp'kj 

(Pour mémoire, cette marque la ligne actuelle, supprime la ligne en dessous, pâtes cette ligne à la en bas du fichier, retourne à la ligne de départ, puis passe à la ligne suivante.)

Enfin, appuyez une fois sur la touche correspondante pour chaque ligne de votre liste. Donc, avec la liste d'exemples, vous presseriez 5 fois. Assurez-vous de commencer à partir de la première ligne de la liste !!

Qu'est-ce que vous aurez à la fin est la suivante:

current_well 
current_well 
current_well 
well_location 
well_location 

well_number 
well_name 
well_type_code 
section 
range 

Vous pouvez maintenant copier facilement chaque liste à chaque fois que vous avez besoin de les mettre.

4

Une option consiste à utiliser cette Align plugin pour aligner les points afin de pouvoir sélectionner plus facilement une colonne en mode Visual Block. par exemple. si vous faites ceci:

:%Align \. 

Vous finirez avec:

current_well . well_number 
current_well . well_name 
current_well . well_type_code 
well_location . section 
well_location . range 

Si vous ne souhaitez pas utiliser un plug-in, essayez padding vos colonnes avec des espaces. par exemple. pour votre texte:

:%s/\v(.*)\.(.*)/\=printf("%-16s %s", submatch(1), submatch(2))/ 

Cela vous laisse avec:

current_well  well_number 
current_well  well_name 
current_well  well_type_code 
well_location section 
well_location range 

Ensuite, vous pouvez Ctrl-V et sélectionner une colonne de texte à copier. Assurez-vous de choisir une largeur de colonne plus large que votre plus grande valeur.

+1

Wow, une excellente réponse, je n'étais pas au courant de printf/submatch dans une substitution; Merci! – dukedave

0

Je le fais tout le temps, simplement en padding avec beaucoup d'espace:

%s/./     /

Ensuite <c-v> pour passer en mode bloc dans l'espace vide, tracer la position de la colonne que je veux, < de changer le texte à droite vers ma colonne, puis maintenez .. Prend quelques secondes.

Une autre façon vous pouvez le faire si vous connaissez la position de la colonne spécifique que vous souhaitez aligner sur: aller à la première ligne et commencer l'enregistrement (qq), trouvez votre délimiteur (f.), insérez un tas d'espace (20i <esc>), supprimez l'espace dans une colonne spécifique (d15|), puis descendez une ligne (j). Ensuite, maintenez la touche Maj enfoncée et faites rouler vos doigts plusieurs fois (ou utilisez le nombre [email protected]) jusqu'à ce que toutes les colonnes soient alignées. :)

0

En haut du fichier:

!}awk -F. '{print $1}' >> % 

On vous dira que le fichier a changé. Sélectionnez l'option L (charger).
Ajoutez une ligne vierge sous les lignes d'origine, revenez en haut.

for(i=1;i<=NR;i++);print $2 >> % 

sélectionnez à nouveau l'option L

Supprimez les lignes d'origine.
Vous avez maintenant les première et deuxième parties dans deux groupes.

3

La commande colonne de Linux fonctionne bien pour créer les colonnes

:%!column -s . -t 

Ensuite, utilisez une copie de bloc.

Questions connexes