linux - AWK - 如何列匹配文件 A 中的多个匹配项匹配文件 B 中的一个匹配项

标签 linux bash awk

我试图在文件 A 的第 1 列和文件 B 的第 2 列之间找到匹配的字符串,并为每个匹配打印文件 A + 文件 B 的整行。问题是文件 A 的第 1 列中有多个具有相同值的字符串,当我使用 awk 解决方案时,它只打印最后一个匹配项而不是所有匹配项。

我尝试使用我之前使用过的 awk 解决方案来匹配文件 A 和文件 B 中的唯一值

awk -vOFS='\t' 'NR==FNR{a[$1]=$0;next} ($2 in a) {print a[$2],$0}' file A file B

文件A

MLLT3   26.53051423 54.24992354 25.50216856
MLLT3   24.32536694 19.96855016 177.7584507
MLLT3   18.9883621  15.83462512 115.2035222
MLLT3   11.79811105 42.91062427 77.35888553

文件B

ENSG00000171843 MLLT3   3.885477052 3.929504522 3.005321522

预期输出:

MLLT3   26.53051423 54.24992354 25.50216856 ENSG00000171843 MLLT3   3.885477052 3.929504522 3.005321522
MLLT3   24.32536694 19.96855016 177.7584507 ENSG00000171843 MLLT3   3.885477052 3.929504522 3.005321522
MLLT3   18.9883621  15.83462512 115.2035222 ENSG00000171843 MLLT3   3.885477052 3.929504522 3.005321522
MLLT3   11.79811105 42.91062427 77.35888553 ENSG00000171843 MLLT3   3.885477052 3.929504522 3.005321522

实际输出:

MLLT3   11.79811105 42.91062427 77.35888553 ENSG00000171843 MLLT3   3.885477052 3.929504522 3.00532152

我对任何解决方案都持开放态度,过去我只是使用 awk 来解决此类问题。

最佳答案

由于 key 在文件 A 中重复但在文件 B 中不重复,请尝试:

$ awk -vOFS='\t' 'NR==FNR{a[$2]=$0;next} ($1 in a) {print $0,a[$1]}' fileB fileA
MLLT3   26.53051423     54.24992354     25.50216856     ENSG00000171843 MLLT3   3.885477052     3.929504522     3.005321522
MLLT3   24.32536694     19.96855016     177.7584507     ENSG00000171843 MLLT3   3.885477052     3.929504522     3.005321522
MLLT3   18.9883621      15.83462512     115.2035222     ENSG00000171843 MLLT3   3.885477052     3.929504522     3.005321522
MLLT3   11.79811105     42.91062427     77.35888553     ENSG00000171843 MLLT3   3.885477052     3.929504522     3.005321522

关于linux - AWK - 如何列匹配文件 A 中的多个匹配项匹配文件 B 中的一个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55738914/

相关文章:

linux - 将 VC++ SetWaitableTimer 移植到 gcc

c++ - 线程零文件描述符中的套接字

linux - 如果使用 AND 条件,awk -F 找不到字符串

bash - 按周数拆分 csv 文件的简单 bash 脚本

r - 在没有 root 访问权限的情况下,当 R 与引用 BLAS 链接时,使用调整后的 BLAS 运行

c - 为什么 syslog 和 gdb 对同一个共享库显示不同的加载地址?

linux - 通过启动器从 bash 脚本调用时保持 'vlc -I dummy' 运行

bash - 如何grep单引号之间的所有内容?

regex - 使用终端 man 命令阅读手册页中的部分

json - Bash sqlite3 行 |如何转换成JSON格式