如何替换文件中与另一列匹配的列

如何替换文件中与另一列匹配的列

我有两个文件。如何将文件 2 中的第二列替换为文件 1 中的第 12 列,使得文件 1 中的第 9 列与文件 2 中的第 1 列相同?

文件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}意味着该规则将适用于第一个文件仅有的因为FNR在 file1 之后会被设置为零。在此规则中,使用第一个文件 的ar字段 9( ) 上索引的字段 12 的内容创建一个数组。阻止对 采取进一步行动。$9file1nextfile1

该表达式的if ($1 in ar) $2=ar[$1]意思是如果第一个字段( $1) in 中找到指数然后ar它将第二个字段更改file2ar。这是因为ar在第一个文件的 $9 上建立了索引file1。由于现在$2file2更改,1将打印新的$0

and 1isawk的打印习惯用语。

答案2

由于您的文件已排序,因此可以使用以下命令完成此join操作:

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

解释:

  • -1这两个文件在 file1 (选项)的第 #9 列和 file2 (-2选项)的第 #1 列上连接
  • 输出 ( -o) 选项由字段 2.1(文件 2 的第 1 列)、1.12(文件 1 的第 12 列)等组成。

相关内容