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

Ton*_*ony 31 unix linux bash awk

文件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    E
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
Run Code Online (Sandbox Code Playgroud)

档案2

A     F    G   
4050 12.1 23.6
4049 14.4 47.8   
4048 23.2 43.9
4047 45.5 21.6
Run Code Online (Sandbox Code Playgroud)

期望的输出

A    B      C      D   E F    G
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
Run Code Online (Sandbox Code Playgroud)

kur*_*umi 35

$ 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
Run Code Online (Sandbox Code Playgroud)

  • @kurumi没有合并,只打印了文件1 (2认同)
  • 一点解释也无妨。 (2认同)

Wil*_*ung 26

谢天谢地,你根本不需要写这个.Unix有一个join命令可以帮你完成这个.

join -1 1 -2 1 File1 File2
Run Code Online (Sandbox Code Playgroud)

这是"在行动中":

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$ 
Run Code Online (Sandbox Code Playgroud)

  • 使用`join`需要按排序顺序排列文件; 显示的输入不按排序顺序(或不按升序排序).它可能是一个使用'awk`的练习,所以很可能你的其他合理的(一旦纠正)解决方案是不可接受的. (3认同)

Jon*_*ler 5

您需要将文件2中的条目读入BEGIN块中的一对关联数组.假设GNU Awk:

BEGIN { while (getline < "File 2") { f[$1] = $2; g[$1] = $3 } }
Run Code Online (Sandbox Code Playgroud)

在主处理块中,您从文件1中读取行,并使用BEGIN块中创建的数组中的正确数据进行打印:

{ print $0, f[$1], g[$1] }
Run Code Online (Sandbox Code Playgroud)

提供文件1作为程序的文件名参数.

awk 'BEGIN { while (getline < "File 2") { f[$1] = $2; g[$1] = $3 } }
     print $0, f[$1], g[$1] }' "File 1"
Run Code Online (Sandbox Code Playgroud)

由于文件名中的空格,因此需要文件名参数周围的引号.你需要getline文件名周围的引号,即使它不包含空格,否则它将是变量名.