为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用AWK合并两个文件?

如何使用AWK合并两个文件?

红颜莎娜 2019-10-18 10:23:50
文件1具有5个字段ABCDE,其中字段A是整数文件2具有3个字段AFG文件1中的行数比文件2中的行数大得多(20 ^ 6到5000)文件1中A的所有条目都出现在文件2中的A字段中我喜欢按字段A合并两个文件并携带F和G所需的输出是ABCDEFG例文件1 A     B     C    D    E4050 S00001 31228 3286 04050 S00012 31227 4251 04049 S00001 28342 3021 14048 S00001 46578 4210 04048 S00113 31221 4250 04047 S00122 31225 4249 04046 S00344 31322 4000 1文件2A     F    G   4050 12.1 23.64049 14.4 47.8   4048 23.2 43.94047 45.5 21.6所需的输出A    B      C      D   E F    G4050 S00001 31228 3286 0 12.1 23.64050 S00012 31227 4251 0 12.1 23.64049 S00001 28342 3021 1 14.4 47.84048 S00001 46578 4210 0 23.2 43.94048 S00113 31221 4250 0 23.2 43.94047 S00122 31225 4249 0 45.5 21.6
查看完整描述

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


查看完整回答
反对 回复 2019-10-18
?
沧海一幻觉

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$ 


查看完整回答
反对 回复 2019-10-18
?
繁花不似锦

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即使文件名不包含空格,您也需要在文件名周围加上引号,否则文件名将是变量名。


查看完整回答
反对 回复 2019-10-18
  • 3 回答
  • 0 关注
  • 812 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信