1

标题可能听起来很荒谬,但让我解释一下。我需要过滤一个txt文件。正如我所说,我应该执行的操作是非常基础的。我正在谈论的文件是这个: http: //gdac.broadinstitute.org/runs/analysiss__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 中编写脚本来执行此操作吗?

4

2 回答 2

1

这可以通过一个简单的“awk”命令来完成:

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

16的意思是看第16列,//里面的词是正则表达式(点代表任意字母)

“awk”可用于任何类 unix 操作系统,例如 Mac OS X 和 Ubuntu,但如果您正在运行 Windows,则必须下载并安装 Cygwin 或其他此类实用程序。

于 2015-03-11T18:34:25.047 回答
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')))
于 2015-03-11T18:50:40.327 回答