我有两个文件:
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);