我有一个如下数据文件:
----------------------------
a b c d e .............
A B C D E .............
----------------------------
但我希望它采用以下格式
----------------------------
a A
b B
c C
d D
e E
...
...
----------------------------
在VIM或Perl中进行转换的最快方法是什么? 感谢。
答案 0 :(得分:5)
基本上:.s/ /
空格 Ctrl + v 输入 /g
输入 {{ 1}} Ctrl + v 输入 jma:.s/ /
输入 Ctrl + v /g
将做的伎俩。 :)
好的,让我们打破它:
'axgg$p'adG
Ctrl + v 输入 :.s/ /
输入:在当前行(/g
),用空格替换(.
)空格(s
)后跟回车符(空格 Ctrl + v Enter < / kbd> / /
),在所有位置(/
)。光标现在应该在最后一个字母的行上(示例中为g
)。e
:向下一行(到j
)。A B C D E
:将标记ma
设置为当前位置...因为我们希望稍后引用此位置。a
Ctrl + v 输入 :.s/ /
输入:执行与上面相同的替换,但没有空间。光标现在应该在最后一个字母的行上(示例中为/g
)。E
:从当前光标位置('a
)中选择以标记E
(我们在上面的步骤3中设置),使用块选择。a
:剪切选区(进入x
注册表)。"
:将光标移动到第一行。gg
:将光标移动到行尾。$
:将先前剪切的文本粘贴到光标位置之后。p
:将光标移动到'a
标记(在步骤3中设置)。a
:删除从光标位置到文件末尾的所有内容(底部留下的空行)。P.S。我希望了解一个“内置”解决方案,但直到这个时候......
答案 1 :(得分:4)
简单的列重新映射:
use strict;
use warnings;
my @a = map [ split ], <>; # split each line on whitespace and store in array
for (0 .. $#{$a[0]}) { # for each such array element
printf "%s %s\n", $a[0]->[$_], $a[1]->[$_]; # print elements in order
}
<强>用法:强>
perl script.pl input.txt
答案 2 :(得分:3)
假设光标位于两行中的第一行,我会使用 命令
:s/ /\r/g|+&&|'[-;1,g/^/''+m.|-j