关于 awk:比较两个文件中的行并仅打印匹配的列


Compare lines from two files and print just a column where it matches

我是使用 AWK 的新手。如果你能帮助我,我会很感激你。

我有两个文件

文件1

1
2
3
4
1   2   3   4   ok  I
5   36  5   6   no  II
58  9   6   4   no  V
4   3   2   1   ok  III

文件2

1
2
3
4
6   9   8   6
58  6   5   4
4   3   2   1
1   2   3   4

我想从文件 1 中的 file2 中找到每一行,如果它匹配 file1 中的打印列 5 和 6

预期输出

1
2
ok III
ok I


1
2
3
4
5
6
7
$ cat tst.awk
{ key = $1 FS $2 FS $3 FS $4 }
NR == FNR {
    map[key] = $5 OFS $6
    next
}
key in map { print map[key] }

.

1
2
3
$ awk -f tst.awk file1 file2
ok III
ok I

我的解决方案是创建一个文件调用 match.awk:

1
2
3
4
5
6
7
FNR == NR {
    found[$1"/" $2"/" $3"/" $4] = 1
}

FNR != NR && $1"/" $2"/" $3"/" $4 in found {
    print $5, $6
}

调用它:

1
awk -f match.awk file2 file1

讨论

  • 请注意,在上面的命令行中,我们将首先遍历 file2。在脚本中,file2 的处理在 FNR == NR 的第一个块中
  • 如果我们在 file2 中遇到行,我们将创建一个键。例如,如果该行包含 58 6 5 4,则键将是 58/6/5/4。使用此键,我们将数组 found 标记为 1(真)
  • 第二个块说:"我们在 file1 中看到一行,并且在 file2 中找到了这一行。如果是这种情况,请打印出结果。