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

时间:2017-03-22 01:52:04

标签: linux bash awk sed

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

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

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

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

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中以逗号分隔的值文件运行这些文件的统计信息(我很有能力这样做),对我来说,我能证明这一点非常重要在我的文件中只有两种模式,模式被命令为“0 1”和“1 0”。

我甚至尝试列出文件

我试过这样做:

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

因为我知道我可以grep文件的存在,并将列表打印到屏幕上。但我想我只是将它传递给了awk,所以计算出来了。

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

我认为它只是将文件传递给awk,所以它打印了第n行。我试过用&&而不是|,它只是打印完整的文件列表,然后以无组织的方式打印完整的数字列表。显然我不知道该怎么做。

2 个答案:

答案 0 :(得分:4)

使用GNU awk

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

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

答案 1 :(得分:1)

使用此循环:

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