AWK 学习笔记: 处理多个文件的例子

在实际应用中,很多时候需要处理不只一个文件,而是处理两个及以上文件, 这个时候就需要去判断当前是哪个文件,并采取相应的操作。

如果我们有两个文件,分别为:

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 来说,只记录当前文件处理的行数,当更换文件之后会归零。 所以,对于两个文件的处理来说,完全可以依靠 FNRNR 来判断文件。

然而对于有多个文件来说,只能根据 FNRNR 去区分第一个文件和其他文件, 想要区分每个不同文件来说,则相对困难。 在多于两个文件的情况下可以使用文件名 FILENAME 变量来直接判断。 修改 my.awk 代码如下:

BEGIN {
    FS=" ";
}
FILENAME==ARGV[1] {
    a[$1]=$0;
}
FILENAME==ARGV[2] {
    if (a[$1]) {
        print a[$1];
    }
}

FILENAME 变量中存有当前处理的文件名,而ARGV数组中则存有按照顺序输入的文件名。 所以,可以直接根据文件名来判断当前处理的文件。

By @Wolfson Liu in
Tags : #linux, #awk,