考虑两个 csv 文件:
$ cat given.csv
123,John
246,Paul
369,George
987,Ringo
$ cat family.csv
246,McCartney
123,Lennon
987,Starr
369,Harrison
请注意,这些行没有顺序!我如何使用awk
、grep
和其他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章 林戈,斯塔尔