Vim 数据处理中的排序

sh/bash/dash/ksh/zsh等Shell脚本
回复
wlusheng
帖子: 48
注册时间: 2008-04-10 10:29
来自: 中国·徐州

Vim 数据处理中的排序

#1

帖子 wlusheng » 2012-09-28 14:07

要用gnuplot画二维平面的等值图,需要把第一第二列的数据按大小排序。首先排第一列,在第一列相等的情况下,按第二列排序,并且要识别正负号和科学计数法。
下面是局部数据,其中前两列分别是x,y轴坐标值。
2.175702729E-09 -3.353610737E-05 1.448040161E+03
2.497590357E-09 3.030567314E-05 1.452767578E+03
3.470420840E-09 1.806916043E-05 1.466018921E+03
3.601394072E-09 1.505586624E-05 1.468033813E+03
7.338603503E-09 -3.675992411E-05 1.443255005E+03
7.519076917E-09 -2.403358667E-05 1.460609131E+03
1.592356824E-08 -4.293827442E-05 1.435997192E+03
2.086965623E-08 -6.712024333E-05 1.436602173E+03
2.701227331E-08 -4.593745689E-05 1.433856567E+03
3.971030793E-08 -4.893995720E-05 1.432674072E+03
4.831414557E-08 -1.029953346E-04 1.448969604E+03
这个问题可以在EXCEL中很容易实现,但是有很多数据来回倒腾,嫌麻烦。我们辛苦学习linux,学习Vim的人其实都是怕麻烦的,总是在追求用简单的命令来实现复杂的问题的解决。呵呵,各位高手仁兄贤弟,指教一下吧。如果这个问题能解决了,我的数据处理工作就会效率嗷嗷叫了!!!拜托拜托。
o(∩_∩)o...,新手,没啥好说的,埋头学习。。。。。。
头像
millenniumdark
论坛版主
帖子: 4159
注册时间: 2005-07-02 14:41
系统: Ubuntu 14.04 (Kylin)
联系:

Re: Vim 数据处理中的排序

#2

帖子 millenniumdark » 2012-09-28 16:09

要识别正负号和科学计数法。
妳真把vim當編輯器的神了……

vim不直接支持按科學計數法排序的。

當然妳可以自己寫個腳本實現下,思路如下:

先按+和-排序,

相同的按E+和E-排序,

再相同的按E+和E-後的數字進行排序,

再相同的按數字的主體部分排序。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: Vim 数据处理中的排序

#3

帖子 lilydjwg » 2012-09-28 16:42

对数的表示方法没有要求的话:

代码: 全选

:Rcode py3 "在新窗口中写:
data = [[float(y) for y in x.split()] for x in b]
b[:] = [' '.join([str(f) for f in l]) for l in sorted(data)]
rcode 插件: http://www.vim.org/scripts/script.php?script_id=3705
你也可以试试 awk 或者 perl、ruby 什么的。
PS: 这样把第三列也排序了……
头像
Strange
帖子: 1824
注册时间: 2006-05-19 9:54
来自: Shanghai

Re: Vim 数据处理中的排序

#4

帖子 Strange » 2012-09-28 18:55

sort命令可以直接排序的,研究一下参数吧
ニンニク入れますか?
x60 with gentoo
wlusheng
帖子: 48
注册时间: 2008-04-10 10:29
来自: 中国·徐州

Re: Vim 数据处理中的排序

#5

帖子 wlusheng » 2012-09-29 8:33

millenniumdark 写了:
要识别正负号和科学计数法。
妳真把vim當編輯器的神了……

vim不直接支持按科學計數法排序的。

當然妳可以自己寫個腳本實現下,思路如下:

先按+和-排序,

相同的按E+和E-排序,

再相同的按E+和E-後的數字進行排序,

再相同的按數字的主體部分排序。
呵呵,首先谢谢你的回答和思路!
大家不都是在说什么神的编辑器,编辑器的神,呵呵!
自己写脚本,暂时还没有这个能力耶。看来要学习一下了。
非常感谢!
o(∩_∩)o...,新手,没啥好说的,埋头学习。。。。。。
wlusheng
帖子: 48
注册时间: 2008-04-10 10:29
来自: 中国·徐州

Re: Vim 数据处理中的排序

#6

帖子 wlusheng » 2012-09-29 8:51

Strange 写了:sort命令可以直接排序的,研究一下参数吧
谢谢解答!
不过好像:sort命令没有这么强劲的功能吧,至少我是没有发现。
o(∩_∩)o...,新手,没啥好说的,埋头学习。。。。。。
wlusheng
帖子: 48
注册时间: 2008-04-10 10:29
来自: 中国·徐州

Re: Vim 数据处理中的排序

#7

帖子 wlusheng » 2012-09-29 8:53

lilydjwg 写了:对数的表示方法没有要求的话:

代码: 全选

:Rcode py3 "在新窗口中写:
data = [[float(y) for y in x.split()] for x in b]
b[:] = [' '.join([str(f) for f in l]) for l in sorted(data)]
rcode 插件: http://www.vim.org/scripts/script.php?script_id=3705
你也可以试试 awk 或者 perl、ruby 什么的。
PS: 这样把第三列也排序了……
谢谢高手,都自己能写vim插件了,佩服的紧!
让我实践一把试试吧!
o(∩_∩)o...,新手,没啥好说的,埋头学习。。。。。。
niejieqiang
帖子: 151
注册时间: 2009-05-29 22:05

Re: Vim 数据处理中的排序

#8

帖子 niejieqiang » 2012-09-29 9:59

lz,是这结果吗?
-2.701227331E-08 -4.593745689E-05 1.433856567E+03
-1.592356824E-08 -4.293827442E-05 1.435997192E+03
3.470420840E-09 1.106916043E-05 1.466018921E+03
3.470420840E-09 1.706916043E-05 1.466018921E+03
3.470420840E-09 1.806916043E-05 1.466018921E+03
3.601394072E-09 1.505586624E-05 1.468033813E+03
7.338603503E-09 -3.675992411E-05 1.443255005E+03
7.519076917E-09 -2.403358667E-05 1.460609131E+03
2.086965623E-08 -6.712024333E-05 1.436602173E+03

我感觉这样的情况还是用脚本好,

代码: 全选

#!perl -w
use strict;

# AUTHOR: niejieqiang

use Math::BigFloat;

map { print $_->[0] } 
sort { $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2] }
map {
    [ 
		$_, map { 
        my $obj = Math::BigFloat->new($_);
		$obj->bstr($_);
	} ( split /\s+/ )[ 0, 1 ] 
    ]
  } <DATA>;
__DATA__
-2.701227331E-08 -4.593745689E-05 1.433856567E+03
3.470420840E-09 1.806916043E-05 1.466018921E+03
3.470420840E-09 1.106916043E-05 1.466018921E+03
3.470420840E-09 1.706916043E-05 1.466018921E+03
3.601394072E-09 1.505586624E-05 1.468033813E+03
7.338603503E-09 -3.675992411E-05 1.443255005E+03
7.519076917E-09 -2.403358667E-05 1.460609131E+03
-1.592356824E-08 -4.293827442E-05 1.435997192E+03
2.086965623E-08 -6.712024333E-05 1.436602173E+03
头像
Strange
帖子: 1824
注册时间: 2006-05-19 9:54
来自: Shanghai

Re: Vim 数据处理中的排序

#9

帖子 Strange » 2012-09-29 13:35

wlusheng 写了:
Strange 写了:sort命令可以直接排序的,研究一下参数吧
谢谢解答!
不过好像:sort命令没有这么强劲的功能吧,至少我是没有发现。
不是:sort而是命令行里的sort,有-k参数专门处理这种问题。
vim里只要 %!sort... 用sort过滤一下就好了
ニンニク入れますか?
x60 with gentoo
chenxing
帖子: 152
注册时间: 2006-01-03 18:23
联系:

Re: Vim 数据处理中的排序

#10

帖子 chenxing » 2012-09-29 16:11

http://stackoverflow.com/questions/2642 ... -unix-sort

指定第一第二关键字用-k

vim里调的话,选上再!sort 加参数就行了
以Wiki模式创建中文Linux文档,欢迎加入 http://linux-wiki.cn
回复