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

标签 linux bash unix awk

文件 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/

相关文章:

c++ - 我的 Linux 应用程序端口在停止时被另一个服务占用

c++ - Berkeley DB 无法使用不同的 Dbt 初始化设置值

linux - 如何在 linux bash shell 中对字符串数组进行排序?

git - 在新机器上重新链接 Github 存储库

linux - 首选终端脚本语言

bash - glassfish死了并且不再重新开始

bash - 带for循环的远程SSH命令

shell - 从文件中删除最后 3 列

python - 找不到gunicorn命令,但它在我的requirements.txt中

linux - 查找所有者或组不等于的地方