首页 > 解决方案 > 合并两个文件并保留不匹配的行

问题描述

我正在研究 sed 命令,但在合并 2 个文件时遇到问题。

文件1.txt

A       1
C       3
E       5

文件2.txt

1 John Lennon
2 Mariah carey
3 Cool & The Gang
4 Westlife
5 Red Hot Chili Peppers

期望的输出

1 John Lennon A
2 Mariah Carey
3 Cool & The Gang C
4 Westlife
5 Red Hot Chili Peppers E

我尝试像这样制作 awk 脚本:

awk 'FNR==NR{seen[$1]=$2; next} $1 in seen{seen[$1]=seen[$1] OFS $2} END{ for (e in seen) print e, seen[e]}' file2.txt file1.txt | sort -V

但是这个输出只显示歌手的一个词(John、Mariah、Cool、Westlife 和 Red),并且不显示歌手的全名。我的脚本有问题吗?

标签: bashawk

解决方案


这可以使用相当简单的两步过程来完成,awk并且不需要使用sort,因为我们可以file2在第二阶段进行处理:

awk 'FNR==NR{seen[$2]=$1; next} $1 in seen{$0 = $0 OFS seen[$1]} 1' file1 file2

1 John Lennon A
2 Mariah carey
3 Cool & The Gang C
4 Westlife
5 Red Hot Chili Peppers E

推荐阅读