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

标签 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 行。我尝试使用 && 而不是 |,它只是打印了完整的文件列表,然后以无组织的方式打印了完整的数字列表。显然我不知道该怎么做。

最佳答案

使用 GNU awk

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

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

关于linux - 如何使用任何 Linux 工具打印 FILENAME 前面的每个文件的第 n(第 5)行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42941329/

相关文章:

Linux 中的 C++ : In what forked-task context should a timer callback execute?

linux - SSH 跨网络中的所有机器,怎么样?

linux - 两个非登录用户之间的rsyncing

linux - 在行的中间添加文本

c++ - 从服务器中不同位置的命令行参数传递的打开文件名

linux - 在 Debian/Ubuntu 中模拟运行一个程序

java - 使用 find 将文件传递到 jar

c - 将 cmp 与进程替换 (stdout) 一起使用? ( bash )

linux - 将 Bash 变量传递给 awk 脚本

linux - 合并相同键的值