awk/grep 匹配两个文件中的单词

awk/grep 匹配两个文件中的单词

我有两个文件:

file1:

905894
1197693
3703749

file2:

905894   Test1
1197693   Test2
3703749  Test3

如果文件 1 第 1 列中的元素与文件 2 第 1 列中的任何单词匹配,我想获取第二列中的值。

我知道 awk 可以做到这一点,但停留在读取文件 1 并使用循环上。

答案1

使用grep

$ grep -wFf file1 file2 
905894   Test1
1197693   Test2
3703749  Test3
  • -f表示我们正在采用模式(每行一个)进行匹配file1

  • -F将从固定字符串中获取模式,file1这意味着在匹配之前无需对它们进行进一步的操作

  • -w表示我们正在匹配包含整个单词模式的行。请注意,仅[A-Za-z0-9_]被视为单词组成字符,任何其他字符都将被视为单词分隔符。这将确保仅匹配整个列,而不是905894abcd列中的任何内容。

检查man grep以获得更多关于此的想法。

答案2

我自己会使用 Perl。

  • 读入文件 1,提取数字列表。
  • 迭代文件2,提取数字和单词
  • 检查 file2 中的“number”是否存在于 file1 中,如果存在则打印该单词。

像这样的东西:

#!/usr/bin/perl

use strict;
use warnings;

my %in_file1;

open( my $file1, "<", "file1.txt" ) or die $!;

while (<$file1>) {
    my ($number) = m/(\d+)/;
    $in_file1{$number}++;
}
close($file1);

open( my $file2, "<", "file2.txt" ) or die $!;

while (<$file2>) {
    my ( $number, $word ) = split;
    if ( $in_file1{$number} ) { print $word, "\n"; }
}

close($file2);

相关内容