如何使用任何Linux工具打印FILENAME前面的每个文件的第n行(第5行)?

所以我的目标是提取我目录中每个文件的第五行。 我在我的目录中有一堆扩展名(* .gjf)文件,并且在第五行总是“1 0”或“1 1”没有引号。

到目前为止,我知道我可以提取这些值,但不能附加到他们的文件名。 这是我一直在使用的代码。

awk 'FNR == 5' *.gjf 1 1 0 1 0 1 1 1 1 1 0 1 

我希望我的parsing文件看起来像这样。

 FILNAME: 1AH7A_TRP-16-A_GLU-9-A.gjf, 1, 1, FILNAME: 1AH7A_TRP-198-A_ASP-197-A.gjf, 1 , 1, FILNAME: 1BGFA_TRP-43-A_GLU-44-A.gjf, 0, 1, FILNAME: CXQA_TRP-61-A_ASP-82-A.gjf, 1, 1, 

我希望文件名在这些值的前面,因为我想在R中以逗号分隔的值文件的forms运行这些文件的统计信息(而且我非常有能力做到这一点),对我来说,certificate这些文件是非常重要的我的文件中只有两种模式,模式被sorting为“0 1”和“1 0”。

我什至试图列出这些文件

我试过这样做:

 grep -l "" *.gjf | awk 'FNR == 5' *.gjf 

因为我知道我可以grep文件的存在,并将列表显示在屏幕上。 但我想我只是把它传递给awk,所以它计算。

 1 1 1 1 0 1 1 1 etc ... 

我认为它只是通过文件awk,所以它打印第n行。 我尝试使用&&而不是|来打印文件的完整列表,然后打印完整的数字列表。 显然我不知道该怎么做。

用GNU awk

 gawk -v OFS=", " 'FNR == 5 {print "FILENAME: " FILENAME, $1, $2; nextfile}' *.gjf 

是的, FILENAME是包含正在处理的当前文件名的awk变量。

使用这个循环:

 for file in *.gjf; do echo "FILENAME: $file, " $(sed 's/ /,/;s/$/,/;5q;d' "$file") done 
  • sed '5q;d'提取第五行