我有几个名为 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
... 按该顺序排序。通过zsh
shell,您可以使用、、...的顺序./file*.dat(n)
获取它们。./file1.dat
./file2.data
./file3.data
./file10.dat
./file11.dat