2015-05-18 31 views
1

我有〜200个文本文件,每个文件大小约10Kb,并且全部命名为fastqc_data.txt,每个文件位于不同的子目录中。这些文件是由第三方生成的。每个文件的顶部如下所示。我的目标是生成一个新文件,其第一列将包含“文件名”值(在本例中为“1265-H19_AGGCAG_L007_R1_001.fastq”,第二列将包含“总序列”值(“41284554”),和第三列将包含 “序列长度”( “100”)的值bash:将值提取到表

实施例的输入文件1:

FastQC 0.10.1 
Basic Statistics pass  
Measure  Value 
Filename  1265-H19_AGGCAG_L007_R1_001.fastq  
File type  Conventional base calls 
Encoding  Sanger/Illumina 1.9 
Total Sequences 41284554   
Filtered Sequences  0  
Sequence length 100  
%GC  41  
END_MODULE 

实施例的输出文件:

Filename Total.Sequences Sequence.length 
1265-H19_AGGCAG_L007_R1_001.fastq 41284554 100 
1265-H20_TTTCAG_L007_R1_001.fastq 51387564 103 
1265-H21_CGGTTG_L007_R1_001.fastq 33254771 96 
+0

这是一个文件的全部内容吗?我想不是,如果你说他们每个10kb。 –

+0

这不是整个文件的内容。更多的它看起来像: 序列标记为质量差的0 序列长度100 %GC 40 >> END_MODULE >>每碱基序列质量合格 #Base平均中值下四分位数上四分第10百分位90百分位 1 32.22927768362192 33.0 31.0 34.0 31.0 34.0 2 32.471828039631184 34.0 31.0 34.0 31.0 – Sarah

+0

这在评论中几乎是难以理解的......要知道的重要一点是,你显示的行是否足够独特。例如,文件中是否有与您尝试匹配的行相同的其他行?顺便问一句,你是否在我的答案中尝试了代码? –

回答

1

你可以改变你的输入一行输出使用awk脚本,如下所示:

awk 'BEGIN{print "Filename Total.Sequences Sequence.length"} 
    /^Filename/{fn=$2} 
    /^Total Sequences/{ts=$3} 
    /^Sequence length/{print fn,ts,$3}' input_file 

BEGIN块在您的文件的任何行被处理之前执行。当其他模式匹配时,这些字段将保存到变量fnts以供稍后使用。当最终模式匹配时,打印该行。

当然,这会产生一些假设,例如所有文件都按相同顺序包含数据。

根据目录结构的细节并假设您的shell支持它,您可能能够将所有文件传递给脚本,如awk '...' **/fastqc_data.txt。这使用“globstar”shell功能以名称fastqc_data.txt递归匹配所有文件,并将它们全部传递给awk脚本。

+0

完美,非常感谢。如所建议的那样,自定义目录路径是最后一个简单的步骤。 – Sarah