假设您有一个包含 2 个字段的 CSV 文件:ID 和电子邮件。您还有另一个包含 2 个字段的文件:电子邮件和姓名。您如何生成一个包含所有三个字段并包含电子邮件的文件?
答案1
修订版3:
您必须按字母顺序对电子邮件的两个列表进行排序,然后将其合并。假设电子邮件字段是 file1 的第 2 个字段和 file2 的第 1 个字段:
sort -t , -k 2,2 file1.csv > sort1.csv
sort -t , -k 1,1 file2.csv > sort2.csv
join -t , -1 2 -2 1 sort1.csv sort2.csv > sort3.csv
参数含义
-t , :',' 是字段分隔符 -k 2,2 :按第二个字段进行字符排序 -k 1,1 :按第一个字段进行字符排序 -1 2 :文件 1,第 2 字段 -2 1 :文件 2,第 1 个字段 > :输出到文件
生产
电子邮件,ID,姓名 电子邮件,ID,姓名 ...
按照电子邮件的字母顺序排序。
请注意,如果任一文件中缺少任何电子邮件,它将从结果中删除。
答案2
答案3
或许这有些小题大做,但您可以将其作为两种表导入数据库(例如 OpenOffice Base)并定义所需输出的报告。
如果 CSV 导入有问题,可以使用电子表格程序(例如 OpenOffice Calc)进行导入。然后可以轻松将结果传输到数据库。
答案4
使用 Go:https://github.com/chrislusf/gleam
package main
import (
"flag"
"os"
"github.com/chrislusf/gleam"
"github.com/chrislusf/gleam/source/csv"
)
var (
aFile = flag.String("a", "a.csv", "first csv file with 2 fields, the first one being the key")
bFile = flag.String("b", "b.csv", "second csv file with 2 fields, the first one being the key")
)
func main() {
flag.Parse()
f := gleam.New()
a := f.Input(csv.New(*aFile))
b := f.Input(csv.New(*bFile))
a.Join(b).Fprintf(os.Stdout, "%s,%s,%s\n").Run()
}