首页 > 解决方案 > 当文件的第二列与另一个文件中的值匹配时如何从文件中提取行

问题描述

我有两个文件。

文件 1:

4
14
18
45
53
60
64
102
106
158
162

文件2:

28 1 2
54 1 2
90 1 1
103 1 1
155 1 17
191 1 1
235 1 1
245 4 1
275 4 1
362 4 1
377 18 1
391 18 1
413 18 2
466 18 2
492 18 2
494 18 41
498 45 1
522 45 1
529 57 3
542 53 1
560 58 6
562 164 25
568 164 5

如果文件 2 的第二列与文件 1 中的值匹配,我想从 file2 中提取值。

所以预期的输出将是:

    245 4 1
    275 4 1
    362 4 1
    377 18 1
    391 18 1
    413 18 2
    466 18 2
    492 18 2
    494 18 41
    498 45 1
    522 45 1
    542 53 1

我在网上看到很多解决方案是使用 python 或 Perl,但是,我想使用 linux 命令来执行此操作,有什么想法吗?

标签: linuxcommand-linecommand

解决方案


这应该做吗?

awk 'FNR==NR{a[$0]++};FNR!=NR{if($2 in a){print}}' file1 file2
245 4 1
275 4 1
362 4 1
377 18 1
391 18 1
413 18 2
466 18 2
492 18 2
494 18 41
498 45 1
522 45 1
542 53 1

解释:

  • 我们将两个文件都交给 awk(在这种情况下,顺序很重要!)。
  • 只要我们读取第一个文件 ( FNR==NR) 我们将每个值存储在一个数组中a[$1]++
  • 当我们到达第二个文件时,我们只检查来自第二个文件的第二列 ( $2) 的值是否在数组中;如果是,我们打印它们。

推荐阅读