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

期望的输出是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等表示一行中的第一、第二等字段.a[$1]=$2 FS $3表示字典(/array)(名为a)由$1个键和$2 FS $3个值填充.

;分隔命令

next表示忽略当前行的任何其他命令.(处理将在下一行继续.)

$0是整条线

{print $0, a[$1]}只需打印整行和a[$1]的值(如果字典中有$1,则只打印$0).现在它只对第二个文件执行(现在是file1),因为是FNR==NR{...;next}.

Linux相关问答推荐

重新运行时避免 Linux bash 脚本中的文件重命名重复

Linux PREEMPT_RT:SCHED_OTHER 的性能优于 SCHED_FIFO.为什么?

如何使用 ftrace 过滤查看函数上方的调用堆栈?

如何在bash中用另一个整数变量增加一个整数变量?

在android上使用lldb-server进行lldb调试?

当接收端未从套接字读取时,通过 Unix 套接字发送的消息会发生什么情况?

Linux time 命令输出中 real、user 和 sys 的含义

如何在 Linux 中设置目录大小限制?

如何有效地使用 grep?

使用 C/C++ (GCC/G++) 在 Linux 中的套接字编程中发送和接收文件

无法创建Java虚拟机

size_t 和 off_t 的用法有什么区别?

加密/解密在两个不同的 openssl 版本之间不能很好地工作

如何 grep 精确的文字字符串(无正则表达式)

Linux 配置/制作,--prefix?

`是什么意思! -d` 在这个 Bash 命令中?

Colored shell 脚本输出库

可以通过 SSH 连接的所有用户的列表

Android - 找不到命令

如何查看线程在哪个 CPU 内核中运行?