请选择 进入手机版 | 继续访问电脑版

分子模拟论坛 Molecular Simulation Forums

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 393|回复: 8

请教一个shell中排序的问题

[复制链接]

18

主题

25

帖子

72

积分

注册会员

Rank: 2

积分
72
发表于 2012-3-3 07:22:00 | 显示全部楼层 |阅读模式
初学shell,相对一些数据做处理。我先从一个文件中把想要的数据提取出来了,但是顺序不对,想问shell中能实现爱指定方式排序吗?先谢了
我的数据为:
  Eigenvalues ---556.27427-556.33380-556.33380-556.41716-556.44966
   r1   1.50000 1.60000 1.70000 1.80000 1.90000
   r3   1.40000 1.40000 1.40000 1.40000 1.40000
--
Eigenvalues ---556.52235-556.50234-556.47834-556.44979-556.41518
   r1   1.90000 1.80000 1.70000 1.60000 1.50000
   r3   1.50000 1.50000 1.50000 1.50000 1.50000
--
。。。。。
我想要得到的为:
Eigenvalues    r1           r3
-556.27427     1.5           1.4
-556.33380     1.6           1.4
-556.33380     1.7          1.4
-556.41716      1.8          1.4
-556.44966     1.9          1.4
-556.41518      1.5           1.5
-556.44979      1.6         1.5
-556.47834      1.7         1.5
-556.50234     1.8         1.5
-556.52235     1.9         1.5

相关帖子

回复

使用道具 举报

173

主题

2919

帖子

6017

积分

论坛元老

Rank: 8Rank: 8

积分
6017
发表于 2012-3-3 09:52:00 | 显示全部楼层
shell 脚本
#!/bin/bash
eig=(`grep
Eig
$1 | cut -c
20
-80`)
r1=(`grep
r1
$1 | cut -c
20
-80`)
r3=(`grep
r3
$1 | cut -c
20
-80`)
echo "Eigenvaluesr1  r3"
for i in `seq 0${#eig[@]}` ; do
echo "${eig[$i]} ${r1[$i]} ${r3[$i]}"
done
###########
使用方法
$ script.shlogfile
蓝色部分可能需要进一步修改, 但在楼主给出的这段例子中是可行的
回复

使用道具 举报

18

主题

25

帖子

72

积分

注册会员

Rank: 2

积分
72
 楼主| 发表于 2012-3-4 16:16:00 | 显示全部楼层
太感谢了。
回复

使用道具 举报

18

主题

25

帖子

72

积分

注册会员

Rank: 2

积分
72
 楼主| 发表于 2012-3-5 01:52:00 | 显示全部楼层
shell 脚本
#!/bin/bash
eig=(`grep Eig $1 | cut -c 20-80`)
r1=(`grep r1 $1 | cut -c 20-80`)
r3=(`grep r3 $1 | cut -c 20-80`)
echo "Eigenvaluesr1  r3"
for i in `seq 0${#eig[@]}` ; do
...
bay__gulf618 发表于 2012-3-3 09:52
您好,我还有问题想请教您,对于您的script,是用for i in `seq 0${#eig[@]}` ; do
echo "${eig[$i]} ${r1[$i]} ${r3[$i]}"实现重新排列r1,r3,E的顺序吗?我上网查资料对于这个命令${#eig[@]还是不理解。能不能帮我解释一下?
另外我用我自己的单机(UNIX)运行了一下这个脚本,为什么会出现下面的错误呢?我用的命令是./script.sh test.log
bash-3.2$ ./script.sh test.log
./script.sh: line 3: grep Eig test.log: command not found
cut: [-cf] list: illegal list value
./script.sh: line 4: grep r1 test.log: command not found
cut: [-cf] list: illegal list value
./script.sh: line 5: grep r3 test.log: command not found
cut: [-cf] list: illegal list value
Eigenvaluesr1  r3
./script.sh: line 8: syntax error near unexpected token `do '
./script.sh: line 8: `for i in `seq 0${#eig[@]}` ; do '
错误说找不到grep这个命令,还有就是cut那个。但是当我直接用grep r1 test.log | cut -c 20-80命令时,我能看到是正确的输出啊?难道是因为我的是unix系统?谢谢
回复

使用道具 举报

173

主题

2919

帖子

6017

积分

论坛元老

Rank: 8Rank: 8

积分
6017
发表于 2012-3-3 09:52:00 | 显示全部楼层
1 eig, r1, r3 是shell 数组, 个数应该相同
${#eig[@]} 是数组eig里头的元素个数.
用这个来控制循环.
2 grep 是linux 的标配, 不会没有. 并且后面也能单独执行grep
看报错好像是把"grep Eig test.log" 看做一个完整的命令了
shell 脚本应该是纯文本文件, 重新制作一下试试看
回复

使用道具 举报

18

主题

25

帖子

72

积分

注册会员

Rank: 2

积分
72
 楼主| 发表于 2012-3-5 09:14:00 | 显示全部楼层
1 eig, r1, r3 是shell 数组, 个数应该相同
${#eig[@]} 是数组eig里头的元素个数.
用这个来控制循环.
2 grep 是linux 的标配, 不会没有. 并且后面也能单独执行grep
看报错好像是把"grep Eig test.log" 看做 ...
bay__gulf618 发表于 2012-3-5 09:14
您好。我重新输入了script,果然能运行,但是结果还是有问题呢?我只想要三列数据:
Eigenvalues    r1           r3
-556.27427     1.5           1.4
-556.33380     1.6           1.4
-556.33380     1.7          1.4
-556.41716      1.8          1.4
-556.44966     1.9          1.4
-556.41518      1.5           1.5
-556.44979      1.6         1.5
-556.47834      1.7         1.5
-556.50234     1.8         1.5
-556.52235     1.9         1.5
但是我运行脚本之后结果为:
Eigenvaluesr1r3
556.27427-556.33380-556.33380-556.41716-556.449661.50000 1.40000
-556.52235-556.50234-556.47834-556.44979-556.41518
1.60000 1.40000
1.70000 1.40000
完全乱套了,是我的输入文件有问题吗?麻烦您在帮我看看。先谢了
回复

使用道具 举报

18

主题

25

帖子

72

积分

注册会员

Rank: 2

积分
72
 楼主| 发表于 2012-3-6 05:44:00 | 显示全部楼层
另外,当我把script中for循环的seq 0${#eig[@]}改为seq 0${#r1[@]}或者seq 0${#r3[@]}时,结果又变成
Eigenvaluesr1r3
-556.27427-556.33380-556.33380-556.41716-556.449661.50000 1.40000
-556.52235-556.50234-556.47834-556.44979-556.41518 1.60000 1.40000
1.70000 1.40000
1.80000 1.40000
1.90000 1.40000
1.90000 1.50000
1.80000 1.50000
1.70000 1.50000
1.60000 1.50000
1.50000 1.50000
为什么会出现这样的额情况呢?
回复

使用道具 举报

173

主题

2919

帖子

6017

积分

论坛元老

Rank: 8Rank: 8

积分
6017
发表于 2012-3-5 09:14:00 | 显示全部楼层
可能是输入文件的问题吧
556.27427-556.33380-556.33380-556.41716-556.44966
各个数据是要加空格分隔的
回复

使用道具 举报

18

主题

25

帖子

72

积分

注册会员

Rank: 2

积分
72
 楼主| 发表于 2012-3-6 06:03:00 | 显示全部楼层
可能是输入文件的问题吧
556.27427-556.33380-556.33380-556.41716-556.44966
各个数据是要加空格分隔的
bay__gulf618 发表于 2012-3-6 09:02
太感谢了,就是空格的问题。thanks a lot
回复

使用道具 举报

Archiver|手机版|小黑屋|分子模拟论坛  

GMT+8, 2019-8-18 17:42 , Processed in 0.093159 second(s), 32 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表