文件 1 有 5 个字段 A B C D E,其中字段 A 是一个整数值
文件 2 有 3 个字段 A F G
文件1的行数比文件2大很多(20^6到5000)
文件1中A的所有条目都出现在文件2中的字段A中
我喜欢按字段A合并两个文件并携带F和G
期望的输出是 A B C D E F G
例子
文件 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
文件 2
A F G
4050 12.1 23.6
4049 14.4 47.8
4048 23.2 43.9
4047 45.5 21.6
期望的输出
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
最佳答案
$ 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
解释:(部分基于另一个 question 。不过有点晚了。)
FNR
指的是当前文件中的记录号(通常是行号),NR
指的是总记录号。运算符 == 是一个比较运算符,当两个周围的操作数相等时返回 true。所以 FNR==NR{commands}
意味着括号内的命令只在处理第一个文件时执行(现在是file2
)。
FS
是指字段分隔符,$1
、$2
等是一行中的第 1、2 等字段。 a[$1]=$2 FS $3
表示一个字典(/array)(名为a
)用$1
键和填充$2 FS $3
值(value)。
;
分隔命令
next
表示当前行忽略任何其他命令。 (处理在下一行继续。)
$0
是整行
{print $0, a[$1]}
只是打印出整行和 a[$1]
的值(如果 $1
在字典中,否则只打印 $0
)。现在它只针对第二个文件(file1
now)执行,因为 FNR==NR{...;next}
。
关于linux - 如何使用 AWK 合并两个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5467690/