在实际应用中,很多时候需要处理不只一个文件,而是处理两个及以上文件, 这个时候就需要去判断当前是哪个文件,并采取相应的操作。
如果我们有两个文件,分别为:
File1
one 1
two 2
three 3
File2
one 3
two 4
four 5
如果我只想输出File1中的第一列在File2中出现的行,可以在 my.awk
中写下以下代码:
BEGIN {
FS=" ";
}
FNR==NR {
a[$1]=$0;
}
FNR!=NR {
if (a[$1]) {
print a[$1];
}
}
在命令行运行该段代码:
$ awk -f my.awk File1 File2
one 1
two 2
在上面的例子中,我使用了 FNR == NR
来判断是否还是第一个文件。
因为对于 NR
变量,其在整个 awk 运行中只递增地记录处理的行数,
而对于 FNR
来说,只记录当前文件处理的行数,当更换文件之后会归零。
所以,对于两个文件的处理来说,完全可以依靠 FNR
和 NR
来判断文件。
然而对于有多个文件来说,只能根据 FNR
和 NR
去区分第一个文件和其他文件,
想要区分每个不同文件来说,则相对困难。
在多于两个文件的情况下可以使用文件名 FILENAME
变量来直接判断。
修改 my.awk
代码如下:
BEGIN {
FS=" ";
}
FILENAME==ARGV[1] {
a[$1]=$0;
}
FILENAME==ARGV[2] {
if (a[$1]) {
print a[$1];
}
}
FILENAME
变量中存有当前处理的文件名,而ARGV
数组中则存有按照顺序输入的文件名。
所以,可以直接根据文件名来判断当前处理的文件。