在 Bash 中匹配并合并记录

在 Bash 中匹配并合并记录

考虑两个 csv 文件:

$ cat given.csv
123,John
246,Paul
369,George
987,Ringo

$ cat family.csv
246,McCartney
123,Lennon
987,Starr
369,Harrison

请注意,这些行没有顺序!我如何使用awkgrep和其他bash工具来获取组合输出文件(顺序不重要):

123,John,Lennon
246,Paul,McCartney
369,George,Harrison
987,Ringo,Starr

我正在考虑for对第一个文件运行一个循环,然后使用它awk来获取 id 和然后grep 第二个文件中的相关记录。在 Bash 中是否有更直接的方法来做到这一点?我发现bash经常有一个聪明、有效的方法处理我还不熟悉的文本文件。

答案1

通过连接和排序:

join -t , <(sort given.csv) <(sort family.csv)

输出:

123、约翰·列侬
246、保罗·麦卡特尼
369、乔治·哈里森
第987章 林戈,斯塔尔


使用 grep:

#!/bin/bash

F1="given.csv"
F2="family.csv"
D=","           # delimiter

while IFS="$D" read FIRST_COLUMN REST; do
  T="$FIRST_COLUMN$D$REST"
  T+="$(grep -oP "^$FIRST_COLUMN\K$D.*" "$F2")" && echo "$T"
done < "$F1"

输出:

123、约翰·列侬
246、保罗·麦卡特尼
369、乔治·哈里森
第987章 林戈,斯塔尔

相关内容