2つのファイルがあります。
file1
:
905894
1197693
3703749
file2
:
905894 Test1
1197693 Test2
3703749 Test3
ファイル1の列1の要素がファイル2の列1の単語と一致する場合は、2番目の列の値を取得したいと思います。
私はawkがこれを行うことができることを知っていますが、ファイル1を読み込んでループを使用するのをやめています。
答え1
使用grep
:
$ grep -wFf file1 file2
905894 Test1
1197693 Test2
3703749 Test3
-f
一致させるパターン(1行に1つずつ)を取っていることを示します。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);