【发布时间】:2016-01-14 20:36:42
【问题描述】:
我想对最后一列中的数字进行排序,$en 以相反的顺序(从最小值到最大值)。更多,我指定了我的数字。它们达到 0 并且只是负数。
我的脚本如下:
!/usr/bin/perl -w
use strict;
my $list=$ARGV[0];
open(LST,$list) or die;
my $time=0;
my @id_table;
my @nr_table;
my @energy;
open(GRO,">waters.gro") or die;
while(<LST>) {
my $pdb_file=$_;
chomp $pdb_file;
my $pdb_id=substr $pdb_file,0,4;
open(PDB,$pdb_file) or die;
while(<PDB>) {
my $line=$_;
my ($w_id, $x, $y, $z, $en) = (split(/\s+/, $line))[1, 5, 6, 7, 8];
next if $en >= 0;
my @energy = sort {$b <=> $a} $en;
print GRO "moja woda t= $time \n";
printf(GRO "%5d\n",1);
printf(GRO " 1SOL OW 1%8.3f%8.3f%8.3f%8.3f\n",$x/10.0,$y/10.0,$z/10.0,$en);
print GRO " 20.0 20.0 20.0\n";
$id_table[$time]=$pdb_id;
$nr_table[$time]=$w_id;
$time++;
}
close PDB;
}
close GRO;
很遗憾,我的排序想法行不通。我是 Perls 脚本的初学者。在我的输出中,我想按递增顺序排列值。
提前谢谢你。 玛塔
我的输入文件:
ATOM 367 OH2 HOH 367 -2.010 7.370 -7.369 -6.52
ATOM 491 OH2 HOH 491 0.990 8.370 -8.369 -2.24
ATOM 652 OH2 HOH 652 5.490 -6.130 2.631 2.98
ATOM 689 OH2 HOH 689 6.490 -15.130 8.631 -4.23
ATOM 738 OH2 HOH 738 7.490 19.870 -8.369 3.38
ATOM 793 OH2 HOH 793 8.990 -2.630 -22.869 -2.29
ATOM 857 OH2 HOH 857 10.490 13.370 -5.869 -1.31
.
.
.
操作后我得到了输出(没有排序线):
moja woda t= 0
1
1SOL OW 1 -0.344 0.437 0.633 -9.290
20.0 20.0 20.0
moja woda t= 1
1
1SOL OW 1 -0.194 0.537 -0.767 -2.990
20.0 20.0 20.0
moja woda t= 2
1
1SOL OW 1 -0.044 0.287 0.333 4.960
20.0 20.0 20.0
moja woda t= 3
1
1SOL OW 1 0.106 0.837 -0.817 -1.300
20.0 20.0 20.0
moja woda t= 4
.
.
.
我想按顺序排列我的数据(对于每一行,取决于 $en 列)。我想我应该创建一个新数组,但我不知道我应该如何准确地以及将排序放在脚本中的确切位置。
【问题讨论】:
-
你能比“它不起作用”更具体吗?
-
@AKHolland 如果您查看代码,则 OP 的问题变得非常明显:
my @energy = sort {$b <=> $a} $en;(不过,您是对的,它们绝对应该更具体。) -
您希望这些行在整个输出中排序,还是在列表文件中每个文件的数据中排序?
-
FWIW,从最小到最大将是升序排序,这是默认值。倒序将是降序排序,或从大到小。
-
请为此问题创建minimal reproducible example(即包括示例数据)和edit您的帖子。如果您帮助我们不必从我们的...呃...耳朵中提取样本数据,那么帮助您解决问题会容易得多。