删除.text文件中的特定行/行 - MATLAB或Perl

时间:2013-12-24 11:28:03

标签: matlab perl row text-files

我目前正在将大型数据集写入.txt文件,使用以下命令继续使用MATLAB平滑值:

hann500=hanning(500);
yy=conv(y,hann500,'same');
fileID = fopen('chrI500bp.txt','w');
for i = 1:length(x)
fprintf(fileID,'%s\t%d\t%d\t%f\n', 'chrI', x(i),x(i),yy(i));
end
fclose(fileID);

有没有办法让MATLAB在创建它之后处理.txt文件,以删除最后一列中包含空值(0.000 ....)的所有行(如下所示)? .txt文件格式为:

chrI    1983    1983    0.000000 - DELETE
chrI    1984    1984    0.000000 - DELETE
chrI    1985    1985    0.000000 - DELETE
chrI    1986    1986    0.000000 - DELETE
chrI    1987    1987    0.000000 - DELETE
chrI    1988    1988    0.000000 - DELETE
chrI    1989    1989    0.000000 - DELETE
chrI    1990    1990    0.000000 - DELETE
chrI    1991    1991    0.000000 - DELETE
chrI    1992    1992    0.000039
chrI    1993    1993    0.000157
chrI    1994    1994    0.000354
chrI    1995    1995    0.000629
chrI    1996    1996    0.000983
chrI    1997    1997    0.001415
chrI    1998    1998    0.001925
chrI    1999    1999    0.002514

或者有没有办法在Perl中执行此操作?

3 个答案:

答案 0 :(得分:2)

您可以使用grep在命令行上执行此操作。使用-v反转您的搜索。它将返回所有不包含该模式的行,即您的一堆零和EOL。将它写入同一个文件(或另一个文件),然后就可以了。

grep -v '0.000000$' foo.txt >foo.txt

如果你想在Perl中使用它,请使用这个单行程序,它也是如此:

perl -n -e 'next if m/0\.000000$/;print' foo.txt

它使用-n在程序周围包裹while (<>) { ... }。该程序是-e,它使用零跳过行并打印其他行。如果您希望将它放在同一个文件中,请添加-i选项。

答案 1 :(得分:1)

我会这样做:

perl -ane '$F[3]!=0 && print' in.txt

查看perlrun

-a开启autosplit,
-n添加了一个while循环 所以这个oneliner与:

相同
while(<>) {
    @F = split(' ');
    print $_ if [$F3] != 0;
}

答案 2 :(得分:0)

为什么你不能在Matlab中做到这一点? 这一行:

fprintf(fileID,'%s\t%d\t%d\t%f\n', 'chrI', x(i),x(i),yy(i));
check yy(i)之前,

首先可以fprint-ing为空值。使用Matlab if/else语句。