2012-03-04 80 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