我有大约 50 个文件,其命名格式为:ERR*.log(即 ERR23432.log、ERR12356.log 等...)。我想从每个文件中提取特定信息(值)。在每个文件中,行尾都有值:final pair1 : Total reads after merging results from multiple database
和final pair2 : Total reads after merging results from multiple databases
。您可以在第 62 行和第 63 行中看到这些行随附的文件。现在,我想要一个脚本来提取这些值并将它们相加,以获得每个文件的单个值。然后,它将给出一个包含提取信息的输出文件,其中第一列是没有扩展名的文件名(即附件示例中的 ERR45666),第二列是添加的值。有人能帮帮我吗?
答案1
使用 GNU awk:
gawk '
BEGIN {print "SampleID","Read_counts"}
BEGINFILE {sum = 0}
/final pair[12] : Total reads after merging results from multiple database/ {sum += $NF}
ENDFILE {print substr(FILENAME,1,length(FILENAME)-4), sum}
' *.log
使用标准 (POSIX) awk,您可以轻松伪造BEGINFILE
使用FNR==1
,但ENDFILE
模式更难;在这种情况下,我建议使用数组来计算总和,以当前文件名为键,并在END
awk '
BEGIN {print "SampleID","Read_counts"}
FNR==1 {k = substr(FILENAME,1,length(FILENAME)-4)}
/final pair[12] : Total reads after merging results from multiple database/ {sum[k] += $NF}
END {for(k in sum) print k, sum[k]}
' *.log
请注意,使用此方法时,不能保证输出顺序与文件名的 glob 扩展的顺序相同*.log
。