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 中找到了这一行。如果是这种情况,请打印出结果。