他の列に一致するファイルの列を置き換える方法

他の列に一致するファイルの列を置き換える方法

2つのファイルがあります。ファイル1の列9がファイル2の列1と同じになるように、ファイル2の列2をファイル1の列12に置き換えるにはどうすればよいですか。

ファイル1

    1 2000 11 11  7  9 45  840                         49667.8048  18.33  HeI  6.10352e-05
    2 2000 11 11  8 56 57  660                         49667.8782  18.15  HeI   0.00546265
    3 1994 11 12  5 18 10 1020                         49668.7284  18.34  HeI  -0.00497437
    4 1994 11 12  7 35 30  840                         49668.8227  18.14  HeI  -0.00357056
    5 1994 11 12  9  6 42  720                         49668.8854  17.99  HeI  -0.00476074
    6 1994 11 14  5 20 43  600                         49670.7279  18.04  HeI  -0.00326538
    7 1994 11 14  7 32 46  630                         49670.8197  17.84  HeI  -0.00598145
    8 3000 11 14  9 21 14  540                         49670.8945  17.66  HeI   0.00701904
    9 1994 11 15  5 21 14  610                         49671.7283  17.88  HeI  -0.00100708
   10 4445 11 15  7  4  5  540                         49671.7994  17.73  HeI  -0.00503540
   11 1994 11 15  9  1 14  600                         49671.8811  17.53  HeI     0.000000
   12 1996  1 11  0 56  4  301                         50093.5444   2.26  HeI   0.00570679
   13 1996  1 11  1  2 30  601                         50093.5506   2.25  HeI   0.00424194
   14 1996  1 11  1 15 23  541                         50093.5592   2.23  HeI   0.00100708
   15 1996  1 11  1 26 29  420                         50093.5662   2.22  HeI   0.00372314

ファイル2

49667.8048   78.450     3.000     1    1
49667.8782   79.900     1.000     1    1
49668.7284   40.890     1.000     1    1
49668.8227   45.790     1.000     1    1
49668.8854   49.770     5.000     1    1
49670.7279   66.060     1.000     1    1
49670.8197   47.380     1.000     1    1
49670.8945   27.270     6.000     1    1
49671.7283   66.190     1.000     1    1
49671.7994   65.320     6.000     1    1
49671.8811   62.290     1.000     1    1

望ましい結果:

49667.8048   6.10352e-05     3.000     1    1
49667.8782   0.00546265      1.000     1    1
49668.7284   -0.00497437     1.000     1    1
49668.8227   -0.00357056     1.000     1    1
49668.8854   -0.00476074     5.000     1    1
......

私は次のことを試しました

awk 'NR==FNR{ar[$9]=$0;next}($1 in ar){print ar[$9],$0}' file1 file2

答え1

使用gawk:

$ awk 'NR==FNR{ar[$9]=$12;next}
($1 in ar) {$2= ar[$1]}1'  file1 file2

このコマンドは、NR==FNR{ar[NR]=$12;next}ルールが最初のファイルに適用されることを意味します。ただFNRfile1以降は0に設定されるからです。この規則では、ar最初のファイルのフィールド9()にインデックス付けされたフィールド12の内容を使用して配列が作成されます。さらなる措置が取られるのを防ぎます。$9file1nextfile1

この式は、if ($1 in ar) $2=ar[$1]最初のフィールド($1)が次に見つかるかどうかを意味します。索引次に、ar2番目のフィールドfile2ar。これはar、最初のファイルの$ 9にインデックスが作成されるためですfile1。これで変更されたため、新しい$2ものが印刷されます。file21$0

1isawkのイディオムを印刷します。

答え2

ファイルがソートされているので、次のようにこれを行うことができますjoin

join file1 file2 -1 9 -2 1 -o 2.1,1.12,2.3,2.4,2.5

説明する:

  • -1両方のファイルは、file1(オプション)の列#9と-2file2(オプション)の列#1でリンクされています。
  • 出力(-o)オプションは、フィールド2.1(ファイル2の列1)、1.12(ファイル1の列12)などで構成されています。

関連情報