![如何从目录内的文件中提取特定信息?](https://linux22.com/image/929864/%E5%A6%82%E4%BD%95%E4%BB%8E%E7%9B%AE%E5%BD%95%E5%86%85%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%AD%E6%8F%90%E5%8F%96%E7%89%B9%E5%AE%9A%E4%BF%A1%E6%81%AF%EF%BC%9F.png)
我有大约 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
。