我有两个文件。如何将文件 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 的内容创建一个数组。阻止对 采取进一步行动。$9
file1
next
file1
该表达式的if ($1 in ar) $2=ar[$1]
意思是如果第一个字段( $1
) in 中找到指数然后ar
它将第二个字段更改file2
为ar
。这是因为ar
在第一个文件的 $9 上建立了索引file1
。由于现在$2
已file2
更改,1
将打印新的$0
。
and 1
isawk
的打印习惯用语。
答案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 列)等组成。