使用通配符在awk中读取多个数据文件

使用通配符在awk中读取多个数据文件

我有几个名为 file1.dat、file2.dat 等的数据文件,每个文件包含两列和三行。

我使用命令读取多个文件

awk '{print $2}' file*.dat

这很好地列出了所有文件中的第二列作为输出。但是,当我尝试仅读取每个文件中的第二行时,仅读取第一个文件 file1.dat 。

awk '{if(NR==2) print $2}' file*.dat

即使我输入

awk '{if(NR==2) print $2}' file1.dat file2.dat file3.dat

即当我省略通配符时

显然我的语法是非常错误的。如果这很重要的话,我在 MacOS Mojave 上使用 awk (不是 gawk)。我很想知道我做错了什么。

答案1

使用FNR而不是NR这里的关键。 NR是所有提供的输入的总记录数;FNR是当前正在处理的输入文件的记录号。

所以:

awk 'FNR == 2 {print $2}' ./file*.dat

另请注意condition {action}更惯用的模式,而awk不是省略状况if()行动部分。

另请注意./在使用 glob 时通常要使用的前缀,以awk避免文件名可能包含=字符时出现问题。

另请注意,glob 按词法排序,./file1.dat, ./file10.dat, ./file11.dat, ./file2.data, ./file3.data... 按该顺序排序。通过zshshell,您可以使用、、...的顺序./file*.dat(n)获取它们。./file1.dat./file2.data./file3.data./file10.dat./file11.dat

相关内容