对齐VI中的列

时间:2009-04-24 19:54:13

标签: vim vi

我有一堆行,我想分成两列,并从每列获取数据。数据看起来像这样:

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

基本上我想做的是根据句点拆分行,将数据转换为两列,然后获取每列的数据。我知道这可以在Excel中完成,但我真的对这个问题的VI解决方案感兴趣。我知道

%s/\./

将使用空格格式化字符串。但是,一旦我的数据看起来像:

current_well    well_number
current_well    well_name
current_well    well_type_code
well_location   section
well_location   range

如何获取每列的所有值,以便将其粘贴到另一个应用程序中?

12 个答案:

答案 0 :(得分:5)

一个选项是使用此Align plugin排列句点,以便您可以更轻松地在可视块模式下选择列。例如如果你这样做:

:%Align \.

你最终会得到:

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

如果您不想使用插件,请尝试使用空格填充列。例如为您的文字:

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

那会让你:

current_well     well_number
current_well     well_name
current_well     well_type_code
well_location    section
well_location    range

然后您可以Ctrl-V并选择要复制的文本列。只需确保选择宽度超过最宽值的列宽。

答案 1 :(得分:5)

linux column命令适用于创建列

:%!column -s . -t

然后使用块复制。

答案 2 :(得分:2)

我多次遇到这个问题。将点更改为制表符会将它们排成一行大部分很好,但不是真的。确实,所有列都将在tabstop上启动,但不能保证它们将位于同一个tabstop上。例如,如果这是您的原始文本:

lt1tab.value1
gt1tabstop.value2

你做了:

%s/\./\t/g

假设一个tabstop是8个空格,你会得到:

lt1tab  value1
gt1tabstop    value2

您可能想要做的是删除除最后一列(或您想要的任何列)之外的所有内容。例如:

%s/^.*\.//

将离开你:

value1
value2

您可以轻松复制和粘贴。


如果你不必使用Vim,你可以使用unix的cut来做你想做的事:

cut -f2 -d. input_file > output_file

答案 3 :(得分:1)

显然,使用块选择和/或Excel的上述方法更容易。但我是一个受虐狂,我决定假设你无法访问其中任何一个,并尝试只使用vi命令。这是我想到的可怕的事情:

我的基本计划是将已连接列的列表一个接一个地转换为两个列表。这基本上涉及将每行分成两行,然后将每隔一行复制到文件的末尾。

因此,首先我们必须使用此命令将每一行分成两行:

:%s/\./^M/

接下来,在文件底部摆动并创建一个空行,然后返回第一行。这有助于以后的可读性。

Go[Esc]
:1

现在,您需要将以下序列映射到您最喜欢的键:

:map [Key] mkjddGp'kj

(对于记录,这标记当前行,删除它下面的行,将该行粘贴到文件的底部,返回到您开始的行,然后移动到下一行。)

最后,对列表中的每一行按一次映射键。因此,使用示例列表,您将按5次。确保从列表的第一行开始!!

最后您将拥有以下内容:

current_well
current_well
current_well
well_location
well_location

well_number
well_name
well_type_code
section
range

现在,您可以轻松地将每个列表复制到需要放置的位置。

答案 4 :(得分:0)

一种可能的解决方案:

  1. w(或W代表WORDS)跳转到下一个单词,
  2. CTRL - R CTRL - W 获取光标下的单词并将其粘贴到命令行< / LI>

    现在你必须在循环中链接这些命令,然后以你自己的方式输出它们。

答案 5 :(得分:0)

为什么不阻止视觉模式? C-v,选择你想要的,并将其粘贴到其他应用程序中。 对于那种粘贴,你应该设置

:set guioptions+=a

嗯,现在我已经重新阅读了你的问题。您是否在询问如何将数据划分为多个列,或者如何将其粘贴到其他应用中?


我想我现在得到了它(读完3)。

按照你的方式做,并获得以前的点所在的空间。然后进行另一次替换,并用制表符替换空格,每个制表符为15或其他。它会很好地排列它们。 然后您可以选择并将它们复制到任何地方。

您也可以匹配正则表达式以选择第二列,但是虽然它像圣诞树一样点亮,但您将无法将其拉出来。

答案 6 :(得分:0)

您可以通过键入 Ctrl-V Ctrl-G Ctrl-Q Ctrl-G <选择gvim中的列/ kbd>(取决于您是否使用Windows插入键映射)然后使用鼠标选择。

答案 7 :(得分:0)

Ctrl V选择一列

答案 8 :(得分:0)

我将点转换为制表符,然后阻止选择每列:

:%S /\./ CtrlV-标签 /克

CtrlV 然后阻止选择列。

或者,由于您有制表符分隔值,它们将直接粘贴到Excel中的列中。

答案 9 :(得分:0)

我一直这样做,只需填充大量空间:

%s/./                     /

然后<c-v>在空白区域中输入阻止模式,绘制我想要的列位置,<将文本向右移动到我的列,然后按住.。需要几秒钟。

如果您知道要排列的特定列位置,可以采用另一种方法:转到第一行并开始录制(qq),找到您的分隔符(f.),插入一堆空格(20i <esc>),将空格删回特定列(d15|),然后向下移动一行(j)。然后,您只需按住shift并将手指翻过@Q多次(或使用计数10@q),直到所有列都排成一行。 :)

答案 10 :(得分:0)

位于文件顶部:

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

您将被告知文件已更改。选择L(加载)选项 在原始行下添加一个空行,返回到顶部。

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

再次选择L选项

删除原始行 你现在有两组的第一和第二部分。

答案 11 :(得分:0)

nnoremap <BS> v"by:%!column -t -s<C-r>b -o'      '<CR>

这是继@NES和@SergioAraujo想法之后的一个很好的解决方案。将其放入您的vimrc。

用法。将光标移到定界符。然后点击Backspace。

说明中,我们使用命名寄存器b来保存定界符。然后将其替换为UNIX实用程序列的--separator选项的变量。

Backspace是一个很好的键,因为在普通模式下与h相同。但是话又说回来,您可能也容易碰到它。