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

Linux 如何显示多个文件的第三行,linux,unix,awk,sed,Linux,Unix,Awk,Sed,我有一个简单的问题。我试图检查文件夹中多个文件的第三行,因此我使用了以下方法: head -n 3 MiseqData/result2012/12* | tail -n 1 但这显然不起作用,因为它只显示最后一个文件的第三行。但我实际上想得到result2012文件夹中每个文件的最后一行 有人知道怎么做吗 对不起,还有一个问题,是否也可以显示特定的第三行属于哪个文件 与显示第三行之前一样,是否也可以显示从中提取的每一行的文件名 因为如果我使用head或tail命令,文件名也会显示出来 谢谢您可

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

head -n 3 MiseqData/result2012/12* | tail -n 1
但这显然不起作用,因为它只显示最后一个文件的第三行。但我实际上想得到result2012文件夹中每个文件的最后一行

有人知道怎么做吗

对不起,还有一个问题,是否也可以显示特定的第三行属于哪个文件

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

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

谢谢

您可以这样做:

awk 'FNR==3' MiseqData/result2012/12*
如果您也喜欢文件名:

awk 'FNR==3 {print FILENAME,$0}' MiseqData/result2012/12*
使用GNU时:

sed -s -n '3p' MiseqData/result2012/12*
或更短

sed -s '3!d' MiseqData/result2012/12*
man sed

<代码> -S >代码>:将文件视为独立的,而不是单个连续的长流。


使用Awk时,变量
FNR
是当前文件中“记录”(默认为行)的编号,因此您只需将其与
3
进行比较,即可打印每个输入文件的第三行:

awk 'FNR == 3' MiseqData/result2012/12*
长文件的更优化版本将跳到匹配的下一个文件,因为您知道只有一行条件为真:

awk 'FNR == 3 { print; nextfile }' MiseqData/result2012/12*
然而,并非所有Awk都支持下一个文件(但它也不是GNU Awk独有的)

使用
头部
尾部
解决方案的更便携的变体是壳中的循环:

for f in MiseqData/result2012/12*; do head -n 3 "$f" | tail -n 1; done
或者使用
sed
(没有GNU扩展,即
-s
参数):

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

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

嗨,兄弟,我在回答这个问题,因为我们知道FNR用于检查行数,所以我们可以运行这个命令来获取每个文件的第三行

awk'FNR==3'MiseqData/result2012/12*

这可能适合您(GNU-sed¶llel):

Parallel将sed命令应用于每个文件,并按顺序返回结果

注意:所有文件只能读取到第三行。 此外,您可能会(像我一样)使用:


但是这将只返回第一个文件。

您想要每个文件的第三行还是最后一行?第三行,因为我想要每个文件都返回这个:head-n3 file_1.txt | tail-n1jotne对您的第二个问题有预感。请始终只问一个问题。很抱歉,下次我会小心,一次写下所有问题!与其他两个
awk
答案有什么区别?没有太大区别,我只是解释一下。不过,你不应该创建一个新的答案来解释现有的答案。一旦你有了足够的声誉,你可以要求作者在评论中添加解释,或者你可以编辑答案以添加解释(但如果作者不喜欢,请准备好拒绝编辑)。你的第三个命令可以应用于许多情况!谢谢,这就是我需要的!哦,对不起,可以根据第三个命令输出文件名吗?因为它确实显示了文件中的每三行,但是也可以显示特定的第三行属于哪个文件吗?@john_w只需在
do
/
done
循环中添加您想要的任何额外命令,例如,
echo-n“$(basename“$f”):”
之后执行
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
parallel -k sed -n '3p\;3q' {} ::: file1 file2 file3 
sed -ns '3p;3q' file1 file2 file3