如何显示多个文件的第三行

joh*_*n_w 6 unix linux awk sed

我有一个简单的问题。我试图检查文件夹中多个文件的第三行,所以我使用了这个:

head -n 3 MiseqData/result2012/12* | tail -n 1
Run Code Online (Sandbox Code Playgroud)

但这显然不起作用,因为它只显示最后一个文件的第三行。但我实际上想要 result2012 文件夹中每个文件的最后一行。

有谁知道这是怎么做到的吗?

另外抱歉还有一个问题,是否也可以显示特定的第三行属于哪个文件?

就像显示第三行之前一样,是否也可以显示从中提取的第三行中的每一行的文件名?

因为如果我使用 head 或 tail 命令,也会显示文件名。

谢谢

Ark*_*kku 4

对于 Awk,变量FNR是当前文件中“记录”(默认为行)的编号,因此您可以简单地将其与3打印每个输入文件的第三行进行比较:

awk 'FNR == 3' MiseqData/result2012/12*
Run Code Online (Sandbox Code Playgroud)

针对长文件的更优化版本会在匹配时跳到下一个文件,因为您知道只有一行条件为真:

awk 'FNR == 3 { print; nextfile }' MiseqData/result2012/12*
Run Code Online (Sandbox Code Playgroud)

然而,并非所有 Awks 都支持nextfile(但也并非 GNU Awk 独有)。

使用您的解决方案的更便携的变体head将tail是外壳中的循环:

for f in MiseqData/result2012/12*; do head -n 3 "$f" | tail -n 1; done
Run Code Online (Sandbox Code Playgroud)

或者使用sed(没有 GNU 扩展,即参数-s):

for f in MiseqData/result2012/12*; do sed '3q;d' "$f"; done
Run Code Online (Sandbox Code Playgroud)

编辑:至于如何打印每个文件的名称的附加问题,您需要自己为每个文件显式打印它,例如,

awk 'FNR == 3 { print FILENAME ": " $0; nextfile }' MiseqData/result2012/12*

for f in MiseqData/result2012/12*; do
    echo -n `basename "$f"`': '
    head -n 3 "$f" | tail -n 1
done

for f in MiseqData/result2012/12*; do
    echo -n "$f: "
    sed '3q;d' "$f"
done
Run Code Online (Sandbox Code Playgroud)