基于另一个 file_2 从 file_1 获取行

Fetching rows from file_1 based on another file_2

我有一个制表符分隔的文本文件,如下所示:

file_1:

A1  13f  Jos  +
B1  zh4  Kia  -
C2  nh2  Met  -
D3  5gh  Lox  +
F4  w4t  Nit  -

file_2

N3  6jg  Jut -
J8  76d  Met +
A1  99g  Kia -
M6  45k  Qox +
V2  87h  Nit -

我想从 file_1 中提取条目,其中第 3 列条目与 file_2 的第 3 列条目匹配,如下 linux:

    B1  zh4  Kia -   
    C2  nh2  Met -    
    F4  w4t  Nit -

comm-12 file_1.txt file_2.txt会有帮助吗?请指导我

comm 期望文件按要比较的列排序,并且其参数之前的 space 不是可选的。

但是您可以使用 cut 提取文件 1 的第三列,如果它们不能出现在任何其他列中,则可以使用 grep 从文件 2 中提取该值:

cut -f3 file_1 | grep -Ff- file_2

虽然行的顺序对应于文件 2。

B1      zh4     Kia     -
C2      nh2     Met     -
F4      w4t     Nit     -

为了获得正确的顺序,我会使用 Perl:

perl -e 'until (eof) {
             @F = split " ", <>;
             $h{ $F[2] } = 1;
         }
         while (<>) {
             @F = split " ";
             print if $h{ $F[2] };
         }' file_1 file_2

它首先将file_1的第三列($F[2])值存储到散列%h中,然后遍历file_2并检查列的值是否在散列中设置了 3。

awk 在这里可能是最简单的(这保留了 file_1 输入顺序):

$ awk 'NR==FNR { seen[]++; next } seen[]' file_2 file_1

B1  zh4  Kia  -
C2  nh2  Met  -
F4  w4t  Nit  -
  • Pattern NR==FNR 仅匹配来自第一个输入文件 (file_2) 的行,并使用 action { seen[]++; next } 构建所有第 3 列值的关联数组

    • seen[]++ 是构造包含一组唯一字段值的关联的常用习惯用法:隐式访问数组 seen 中的键 </code>(第 3 个字段的值)<em>在第一次访问时为那个键创建</em>一个条目,post-increment <code>++给条目一个非零值,它在布尔上下文中计算为真(下面讨论的模式利用了)。
  • 由于前面的操作中的 next,模式 seen[] 仅针对第二个输入文件 (file_1) 执行,并且仅计算为真如果第二个文件的第 3 列值也存在于第一个文件中。计算结果为 true 的模式隐式打印手边的行。

awk 回答。这适用于小文件。对于大文件,看到的数组会变得很大,因为数组中保留了完整的行[=12=]

awk 'NR==FNR { seen[] = [=10=]; next}  in seen {print seen[]}' file_2 file_1

输出

A1  99g  Kia -
J8  76d  Met +
V2  87h  Nit -