标题听起来可能是胡说八道,但让我解释一下。我需要过滤一个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中编写脚本来做到这一点吗?
答案 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')))