我有一堆行,我想分成两列,并从每列获取数据。数据看起来像这样:
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
如何获取每列的所有值,以便将其粘贴到另一个应用程序中?
答案 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)
一种可能的解决方案:
现在你必须在循环中链接这些命令,然后以你自己的方式输出它们。
答案 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相同。但是话又说回来,您可能也容易碰到它。