我目前正在将大型数据集写入.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中执行此操作?
答案 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
语句。