ファイルに保存されている名前を、2番目のファイルに保存されている番号に割り当てる

ファイルに保存されている名前を、2番目のファイルに保存されている番号に割り当てる

2 つのファイルがあります:

>head(fileA)
   2    1   544.8  1279.2   1.0603  3.2460  0.0542 
   3    1   546.2  1277.8   1.0463  3.2460  0.0553 
   3    2   543.9  1280.1   0.1652  3.2460  0.0177 
   4    1   543.7  1280.3   1.0819  3.2460  0.0527 
>head(fileB)
1 Coly
2 Mony
3 Fong
4 Wow
5 Poly

ファイルBの名前をファイルAの番号に割り当てて、次の出力を得たいと思います。

   2 Mony   1 Coly   544.8  1279.2   1.0603  3.2460  0.0542 
   3 Fong   1 Coly  546.2  1277.8   1.0463  3.2460  0.0553 
   3 Fong   2 Mony  543.9  1280.1   0.1652  3.2460  0.0177 
   4 Wow    1 Coly   543.7  1280.3   1.0819  3.2460  0.0527 

正直に言うと、私は何も試すことができませんでした。ただ、これを行う方法を調べるのに多くの時間を費やしました。私が考えた唯一のことは、ファイル A の数字を変数に割り当て、この変数が見つかるたびにファイル B のコンテンツを追加することでした。残念ながら、これを行う方法がわかりません。

何か提案、リンク、指示はありますか? ありがとうございます

答え1

bash の read、grep、tr を使用できます。

cat fileA | while read i j k ; do
  grep "^$i\W" fileB | tr '\n' ' '
  grep "^$j\W" fileB | tr '\n' ' ' 
  echo $k 
done

答え2

Perl が救世主です!

#! /usr/bin/perl
use warnings;
use strict;

open my $B, '<', 'B' or die $!;
my %name_of;
while (<$B>) {
    my ($num, $name) = split;
    $name_of{$num} = $name;
}

open my $A, '<', 'A' or die $!;
while (<$A>) {
    my @F = split;
    splice @F, 2, 0, $name_of{ $F[1] };
    splice @F, 1, 0, $name_of{ $F[0] };
    print "@F\n";
}

2 番目の段落では、B ファイルをハッシュ テーブルに読み込み、番号を名前にマッピングします。3 番目の段落では、A ファイルを読み込み、各行を配列に分割し、最初の 2 つの列に従ってハッシュ テーブルから取得した名前を配列に挿入し、それを出力します。

関連情報