3 回答
TA贡献1777条经验 获得超3个赞
$ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1
4050 S00001 31228 3286 0 12.1 23.6
4050 S00012 31227 4251 0 12.1 23.6
4049 S00001 28342 3021 1 14.4 47.8
4048 S00001 46578 4210 0 23.2 43.9
4048 S00113 31221 4250 0 23.2 43.9
4047 S00122 31225 4249 0 45.5 21.6
4046 S00344 31322 4000 1
TA贡献1824条经验 获得超5个赞
值得庆幸的是,您根本不需要编写此代码。Unix有一个join命令可以为您执行此操作。
join -1 1 -2 1 File1 File2
这里是“实际中”:
will-hartungs-computer:tmp will$ cat f1
4050 S00001 31228 3286 0
4050 S00012 31227 4251 0
4049 S00001 28342 3021 1
4048 S00001 46578 4210 0
4048 S00113 31221 4250 0
4047 S00122 31225 4249 0
4046 S00344 31322 4000 1
will-hartungs-computer:tmp will$ cat f2
4050 12.1 23.6
4049 14.4 47.8
4048 23.2 43.9
4047 45.5 21.6
will-hartungs-computer:tmp will$ join -1 1 -2 1 f1 f2
4050 S00001 31228 3286 0 12.1 23.6
4050 S00012 31227 4251 0 12.1 23.6
4049 S00001 28342 3021 1 14.4 47.8
4048 S00001 46578 4210 0 23.2 43.9
4048 S00113 31221 4250 0 23.2 43.9
4047 S00122 31225 4249 0 45.5 21.6
will-hartungs-computer:tmp will$
TA贡献1851条经验 获得超4个赞
您需要将文件2中的条目读取到BEGIN块中的一对关联数组中。假设GNU Awk:
BEGIN { while (getline < "File 2") { f[$1] = $2; g[$1] = $3 } }
在主处理块中,您从文件1中读取该行,并使用在BEGIN块中创建的数组中的正确数据打印该行:
{ print $0, f[$1], g[$1] }
提供文件1作为程序的文件名参数。
awk 'BEGIN { while (getline < "File 2") { f[$1] = $2; g[$1] = $3 } }
print $0, f[$1], g[$1] }' "File 1"
由于文件名中有空格,因此需要在文件名参数周围加上引号。getline即使文件名不包含空格,您也需要在文件名周围加上引号,否则文件名将是变量名。
- 3 回答
- 0 关注
- 812 浏览
添加回答
举报