awk / grepは2つのファイルの単語を一致させます。

awk / grepは2つのファイルの単語を一致させます。

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);

関連情報