2012-03-04 58 views
1

我有一个100个.dat文件就像一个在左侧窗格中,我需要进口无头,然后对行进行排序。导入无头数据和重新排列列数据

workspace

答案通过文件做手工,文件:

data=sortrows(data,2); #sort all columns of data via the 2nd col 


fid=fopen('pole_2_TurbI_chamber_05_RSM.xy'); 
[x ~] = textscan (fid, '%f %f', 'HeaderLines', 4); # reads file correctly 
fclose(fid); 

v(:,1)=cell2mat(x(:,1)); # convert from cell to array 
v(:,2)=cell2mat(x(:,2)); 
v=sortrows(v,2);   # sort rows according to column 2 

% fig 
plot(v(:,1),-v(:,2),'ro'); 

我怎么能这样延伸到我的目录中的所有文件?也许给每个导入的变量文件名......如果可能的话。 问候,

+1

你能不能把循环在你手动解决方案,使其自动解决方案? – Pursuit 2012-03-04 17:26:48

回答

1

在一个POSIX系统,单独文件,可以使用

sort -k 2 /tmp/sortme.txt 

将被写入到stdout的输出进行排序。

如果要排序的一组文件,你会在包装家居循环:

for i in *.dat 
do 
    sort -k 2 $i > $i.tmpsort -k 2 
    mv $i.tmp > $i 
done 

(在这个例子中,请确保你没有的原始输入文件的任何成对被命名为x.dat和x.dat.tmp,或者你会打破x.dat.tmp)。

下面是用Perl编写的版本,这应该是便携系统(不管你正在运行...)。脚本去除所有不以数字0-9开头的行。

#! /usr/bin/perl 
use strict; 

sub getcol2 { 
    $_[0] =~ /\d+\.?\d*\s+(-?\d+\.\d+)/; 
    print "$1\n"; 
    return($1); 
} 

for my $file (@ARGV) { 
    my $INPUT; 
    my @data; 
    open($INPUT, "<", $file) or die "Cannot open '$file' for input: $!"; 


    while(<$INPUT>) { 
     #print "$_"; 
     push @data, $_ if(/^\d/); 
    } 
    close $INPUT; 
    @data = sort { getcol2($b) <=> getcol2($a) } @data;  

    my $OUTPUT; 
    open($OUTPUT, ">", $file); 

    for my $line (@data) { 
     print $OUTPUT $line; 
    } 
    close($OUTPUT); 
} 

我把它叫做 'sortdata.pl',它可以被称为

perl sortdata.pl *.dat 

它会覆盖数据文件;确保您备份原件。

+0

我实际上在文件中也有标题,理想情况下我想删除标题。但因为我不在Linux上......有没有办法解决这个问题? – HCAI 2012-03-04 17:47:12

+0

感谢您发布工作代码。这将派上用场!但是我不想自己改变文件。如何通过使用通配符或循环来导入我的目录中的所有文件?例如我想要所有的文件名为:'pole _ * _ TurbI_chamber_05_RSM.xy' – HCAI 2012-03-06 11:39:04

+1

我真的不知道......自从我上大学以来,我一直在使用matlab,运行在Sun3工作站上。那大概是20年前。我怀疑我曾经在该环境中导入过一个文件。我只是发现了“带头和排序一堆文件”的问题很有趣。 – 2012-03-06 13:53:39