1

左側のペインにあるような 100 個の .dat ファイルがあり、ヘッダーなしでインポートしてから行を並べ替える必要があります。

ワークスペース

ファイルごとに手動で行うための答え:

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');

これをディレクトリ内のすべてのファイルに拡張するにはどうすればよいですか? おそらく、インポートされた各変数にファイル名を付けます...可能であれば。よろしく、

4

1 に答える 1

1

posix システムでは、個々のファイルは次を使用してソートできます。

sort -k 2 /tmp/sortme.txt

出力は stdout に書き込まれます。

ファイルのグループを並べ替えたい場合は、すべてを for ループでラップします。

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

データファイルを上書きします。必ずオリジナルをバックアップしてください。

于 2012-03-04T17:25:43.813 に答える