将这两列转换成行?

Transpose these two colums into rows?

我从网页上复制粘贴了一些数据:

x       y
0       9
2       22.6
4       44.2
5       62.1
7       96.9
8       113.4
10      133.4
11      137.6
15      148.4
17      149.3

我想转置并稍微转换数据,例如:

x = 0,2,4,...
y = 9, 22.6, 44.2...

我知道如何使用 v 模式在每列之后放置逗号,但我不知道当我有两位数或字符长度混合的列时如何工作。

我更关心如何转置,如果这是我想要的命令?

如何将我的数据转换为所需的形式:

x = 0,2,4,...
y = 9, 22.6, 44.2...

如果您安装了外部工具 rs 请参阅下面的第二种方法, 否则:

纯粹Vim

我的方法将围绕使用视觉块模式 Ctrl + v 并应用 J 命令,并使用替换进行清理。第一的 select可视块中的第二列删除,然后粘贴到 x 列:

x   
0   
2   
4   
5   
7   
8   
10  
11  
15  
17  

y
9
22.6
44.2
62.1
96.9
113.4
133.4
137.6
148.4
149.3

然后你可以vipJ,在每个块上,select那个数据,然后把它放在一个 行(仅供参考:vipJ 将进入 visual 模式,selecting inside p 段落, 然后 J加入这些行):

x   0   2   4   5   7   8   10  11  15  17  

y 9 22.6 44.2 62.1 96.9 113.4 133.4 137.6 148.4 149.3

快速替换:s/\s\+/, /g可以用逗号替换空格:

, x, 0, 2, 4, 5, 7, 8, 10, 11, 15, 17, 

, y, 9, 22.6, 44.2, 62.1, 96.9, 113.4, 133.4, 137.6, 148.4, 149.3

那你可以把多余的逗号清理掉,加上=号,去掉 空白行等:

x = 0, 2, 4, 5, 7, 8, 10, 11, 15, 17
y = 9, 22.6, 44.2, 62.1, 96.9, 113.4, 133.4, 137.6, 148.4, 149.3

如果有很多列,您可能不想重复该过程 以上每个...在这种情况下,您可以将以上内容记录为 以可重复的方式宏或查看下面的方法。

使用外部工具 rs

rs 工具允许您重塑数据数组,因此您可以过滤文件 (或视觉 selection,或传递范围)从 vim 内部穿过工具 像这样:

:%!rs -T -C,

flags -T表示转置,-C指定列分隔符 产生的输出(在我们的例子中是逗号):

x,0,2,4,5,7,8,10,11,15,17,
y,9,22.6,44.2,62.1,96.9,113.4,133.4,137.6,148.4,149.3,

然后就像在纯粹的 vim 方法中一样,您只需要做一些清理工作:

:%s/,/, /g

产生:

x, 0, 2, 4, 5, 7, 8, 10, 11, 15, 17, 
y, 9, 22.6, 44.2, 62.1, 96.9, 113.4, 133.4, 137.6, 148.4, 149.3, 

然后你可以清理多余的逗号并添加=符号:

x = 0, 2, 4, 5, 7, 8, 10, 11, 15, 17
y = 9, 22.6, 44.2, 62.1, 96.9, 113.4, 133.4, 137.6, 148.4, 149.3

奖金

如果需要,您可以 运行 外部命令(也可以在视觉 selection 上,或者 传递一个范围):%!column -t 来很好地对齐:

x  =  0,  2,     4,     5,     7,     8,      10,     11,     15,     17
y  =  9,  22.6,  44.2,  62.1,  96.9,  113.4,  133.4,  137.6,  148.4,  149.3