我有一个100个.dat文件,就像左侧窗格中的文件一样,我需要导入没有标题,然后对行进行排序。
ANSWER手动执行,逐个文件:
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');
如何将其扩展到目录中的所有文件?也许给每个导入的变量赋予文件名......如果可能的话。 的问候,
答案 0 :(得分: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的原始输入文件对,或者您将使用clobber 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
它会覆盖数据文件;确保备份原件。