bash - 合并两个文件并保留不匹配的行
问题描述
我正在研究 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),并且不显示歌手的全名。我的脚本有问题吗?
解决方案
这可以使用相当简单的两步过程来完成,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
推荐阅读
- java - 使用二叉搜索树的 TreeMap
- sql - 下面的 SQL 语句是否正确?
- php - phpoffice\phpspreadsheet - 数据系列值 -> 数据源
- python - 如何在 GridSearchCV 的 keras 模型的超参数优化中使用简单的验证集?
- vim - VIM vimscript:autocmd 将 foldcolumn 设置为 foldlevel 的值
- c# - Powershell 脚本流和事件
- excel - 删除特定单元格正下方的单元格
- powerbi - 在 Power Query 中禁用“启用加载”
- c - 客户端读取空行
- amazon-web-services - 将用户从一个 AWS Cognito 池迁移到另一个保留 CognitoId/Sub 值