对包含原始数据的大文件进行基本数据过滤操作

时间:2015-03-11 17:52:13

标签: matlab sas-jmp

标题听起来可能是胡说八道,但让我解释一下。我需要过滤一个txt文件。正如我所说,我应该执行的操作是非常基本的。我正在谈论的文件就是这个: http://gdac.broadinstitute.org/runs/analyses__2014_10_17/reports/cancer/BRCA-TP/Mutation_Assessor/BRCA-TP.maf.annotated

首先,我专注于这项任务: 请在数据文件中找到Tumor_Sample_Barcode列。如您所见,对应于该列的所有行都采用以下格式: TCGA-02-0001-01C-01D-0182-01

“C”之前的两个字符在这里至关重要。在示例格式中,这些字符为“01”。我正在寻找那些包含“01”的行。即,应该消除那些具有任何其他特征的行。

如果文件的大小不是56.2 MB,我可以轻松地使用MATLAB处理它。但是,当我尝试在MATLAB中使用以下行分割文件的列时,我收到了一个错误。

[numData,textData,rawData] = xlsread('BRCA-TP.maf.annotated.csv');

虽然我最大化了MATLAB的Java堆内存,但我得到了没有足够内存的错误来在编辑器中实现这个任务。

我寻找任何替代方法。 JMP可能对我有帮助,但我对该软件没有经验。即使像我上面描述的基本操作也许对我来说很痛苦。

有没有办法实现我在MATLAB中解释的操作?如果没有,你能帮我弄清楚如何在JMP中编写脚本来做到这一点吗?

2 个答案:

答案 0 :(得分:1)

这可以通过一个简单的" awk"命令:

awk '$16 ~ /....-..-....-01C-...-....-../' BRCA-TP.maf.annotated > BRCA-TP.maf.annotated.filtered

16表示查看第16列,//中的术语是正则表达式(其中点代表任何字母)

" AWK"适用于任何类似Unix的操作系统,如Mac OS X和Ubuntu,但如果您正在运行Windows,则必须下载并安装Cygwin或其他此类实用程序。

答案 1 :(得分:0)

如果你想在matlab中出于特定原因这是另一个解决方案。基本上它遍历文件中的每一行,并隔离第16个制表符分隔值(条形码)。对于较新版本的matlab(具有strsplit),这可能会更短,但regexp适用于旧版本

fid = fopen('tumor.csv');

%Tumor_Sample_Barcode is the 16th column
col_of_interest = 16;

sline = fgetl(fid);

while ischar(sline)
    %splits the line by tabs
    tokenized_line = regexp(sline,'\t','split');

    %makes sure the line contains the token (this should always be true for
    %your file, but just in case
    if (col_of_interest <= numel(tokenized_line))
        tumor_barcode = tokenized_line{col_of_interest};

        if not(isempty(regexp(tumor_barcode,'....-..-....-01C-...-....-..','match')))
            %if so display the line, or do other processing
            disp(tumor_barcode)
        end
    end

    sline = fgetl(fid);
end

fclose(fid);

修改

我看到你对另一个答案的评论,如果你想搜索01C 02C和03C,你可以使用范围在正则表达式中一次性完成所有操作。 [1-3]意味着取1到3之间的任何东西

if not(isempty(regexp(tumor_barcode,'....-..-....-0[1-3]C-...-....-..','match')))