在vim中创建1列中的2列
Posted
技术标签:
【中文标题】在vim中创建1列中的2列【英文标题】:Create 2 columns out of 1 in vim 【发布时间】:2021-05-13 16:23:37 【问题描述】:我有 2 个很长的串联数组:
["MyHashMap"
"remove"
"put"
"remove"]
[[]
[27]
[65,65]
[19]]
我只是进入可视模式,y
第二个数组,然后回到第一行,走到它的末尾,添加空格并点击p
。变成:
["MyHashMap"
[[]
[27]
[65,65]
[19]]
"remove"
"put"
"remove"]
我想要的输出是:
["MyHashMap" [[]
"remove" [27]
"put" [65,65]
"remove"] [19]]
我怎样才能做到这一点?
【问题讨论】:
我发现输入和所需输出都令人困惑 - 你确定这就是你想要的吗?并不是说我认为这可以在vim
中轻松完成。
为什么你有 4 个左方括号 [
,但有 5 个右方括号 ]
?
@tink 如果你能澄清什么让你特别困惑,我会非常乐意将其清除。也许您可以建议使用 sed 或 awk 的不同方法,我也欢迎。本质上:我有 2 个长输出数组,我将它们都复制了,并用 \n
替换了 ,
。这将 2 行转换为 1 个长列。现在,我想将其设为两列输入/输出,以便我可以比较这些值并找到错误所在。为了方便比较,我需要以这种方式排列 2 个以上的数组,但步骤很简单。
@tink 关于大括号,我只是复制了不一定对应行的示例数据,因此其中一个大括号丢失了。但在真实数据中,会有正确数量的大括号。
【参考方案1】:
:set virtualedit=all
这样您就可以将光标移动到没有字符的地方(超过行尾)。
将光标移动到第 5 行的第一列并使用CTRL-V
进入可视块模式。选择最后四行的内容。按d
删除选择。
将光标移动到第一行,即您想要第二列的位置。按p
粘贴。
【讨论】:
酷 - 学到了新东西;到目前为止还没有遇到:set virtualedit=all
。
@ProgMetalSlug 相同的结果。唯一的区别是我没有运动边界。删除的列仍会粘贴在第一行之后。
@user3081519 确保选择具有可视块模式的文本 (CTRL-V
)。这不适用于视觉模式 (v
) 或视觉线模式 (V
aka SHIFT-V
)。
是的,这行得通!我的手指习惯性地拍打着常规的视觉效果。非常感谢!【参考方案2】:
所以...回到你原来的数据格式(为了完整起见,我添加了一个额外的“行”):
这里是数据:
$ cat yuck
["MyHashMap","remove","put","put"]
["MyMashNap","mover","gut","hut"]
[[],44],[95,30]]
这里是一个 awk 脚本:
$ cat a.f
BEGIN
FS=","
for (f = 1; f <= NF; f++) a[NR, f] = $f
NF > nf nf = NF
END
for (f = 1; f <= nf; f++)
for (r = 1; r <= NR; r++)
printf a[r, f] (r==NR ? RS : OFS)
以及如何运行它:
$ awk -f a.f yuck | column -t
["MyHashMap" ["MyMashNap" [[]
"remove" "mover" 44]
"put" "gut" [95
"put"] "hut"] 30]]
【讨论】:
出于对工作量的尊重,我会为您的答案投票。谢谢! 嘿-谢谢。当数组数量变大时,只需将其视为一种稍微不那么“手动”的方法。 ;)【参考方案3】:使用可视块选择:
如果你在第一行:
4j ............. jump to line five
Ctrl-v ......... start visual block
3j$ ............ select the end of the paragraph
dgg ............ delete and goes to the first line
A<Space> ....... add an extra space
<Esc>p ......... paste deleted block
【讨论】:
以上是关于在vim中创建1列中的2列的主要内容,如果未能解决你的问题,请参考以下文章
R:如何使用其他列中的数据在一列中创建多个新值并为每个新值重复行?
如何通过在两行之间划分特定列中的值并保持其他列不变来在熊猫数据框中创建新行?