我有大约200个文本文件,每个文件大小约10Kb,所有文件都名为fastqc_data.txt
,每个文件位于不同的子目录中。这些文件是由第三方生成的。每个文件的顶部如下所示。我的目标是生成一个新文件,其第一列将包含“文件名”值(在此示例中为“1265-H19_AGGCAG_L007_R1_001.fastq”,第二列将包含“总序列”值(“41284554”),第三列将包含“序列长度”(“100”)的值。
示例输入文件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 :(得分: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
块。当匹配其他模式时,字段将保存到变量fn
和ts
,以便稍后使用。当最终模式匹配时,将打印该行。
当然,这会产生许多假设,例如所有文件都包含相同顺序的数据。
根据目录结构的详细信息并假设您的shell支持它,您可以将所有文件传递给脚本,如awk '...' **/fastqc_data.txt
。这使用" globstar" shell功能以递归方式匹配名称为fastqc_data.txt
的所有文件,并将它们全部传递给awk脚本。