在许多文件夹中的同一文件上执行awk命令并附加输出

时间:2017-09-12 21:35:29

标签: shell awk

我有40个文件夹(COPD1 ... COPD40),所有文件夹都有一个名为summary.txt的文件。我想在所有这些文件夹中提取最后一行的最后一个元素(例如“90%”)。我知道怎么做一次:

awk '/Overall alignment rate:/{print $NF}' summary.txt 

我不确定如何对所有40个文件夹执行此操作,并将提取的元素附加到新的.txt文件,以便最终产品如下所示:

COPD1 98%
COPD2 96%
...
COPD40 97.5%

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

$ awk '/Overall alignment rate:/{print FILENAME,$NF}' COPD*/summary.txt
COPD1/summary.txt 90%
COPD2/summary.txt 90%
COPD3/summary.txt 90%
[...snip...]

注意:

  1. Awk有一个变量FILENAME,这是当前的文件名。

  2. shell glob COPD*/summary.txt将扩展为名为summary.txt的所有文件,这些文件位于以COPD开头的目录中。

  3. 文档

    来自POSIX spec for awk

      

    FILENAME
    当前输入文件的路径名。在一个开始   动作值未定义。在END动作中,值应为   处理的最后一个输入文件的名称。

答案 1 :(得分:0)

请你也试试。

awk 'val && FNR==1{close(val)} /Overall alignment rate:/{print FILENAME,$NF;val=FILENAME;nextfile}' COPD*/summary.txt

所以我在这里关闭文件(将在后端打开,如果在目录中有太多文件,可能会产生问题)。此外,因为我们只是寻找字符串(整体对齐率:),如果它发现它关键字nextfile将跳转到下一个文件然后(所以我们可以通过NOT读取完整文件一旦获得匹配字符串来节省一些周期)。