根据共同数据合并文件

根据共同数据合并文件

我有两个 csv 文件

文件1:

799001,8_802,3122,627654

文件2:

799001,567765,v567575

当我尝试以第 1 列为键合并两个文件时,我可以看到文件正在合并,但是 file1 的第 3 列没有被打印。

我的输出:

799001,2_802_3122,567765,v567575

预期输出:

799001,2_802_3122,627654,567765,v567575

我试过这个:

awk -F , 'BEGIN { OFS = FS } FNR == NR { names[$1] = $2; next } ($1 in names) { print $1, names[$1], $2 , $3 , $4 }' file1 file2

为什么column3没有被合并?

答案1

假设两个文件在连接字段(第一个逗号分隔字段)上排序,那么您可以使用

$ join -t , file1 file2
799001,8_802,3122,627654,567765,v567575

如果数据未排序,您需要通过创建新的排序文件或使用进程替换(在支持这些的 shell 中)对其进行预排序:

$ join -t , <( sort file1 ) <( sort file2 )
799001,8_802,3122,627654,567765,v567575

如果你不这样做对数据进行排序,因为您想保留一个或另一个文件的顺序,那么您可以awk像这样使用:

$ awk -F , 'BEGIN { OFS = FS } NR == FNR { key[$1] = $0; next } ($1 in key) { k = $1; sub("^[^,]*,",""); print key[k], $0 }' file1 file2
799001,8_802,3122,627654,567765,v567575

这是相似的到你所拥有的,但可以节省整条线在关联数组中。然后,该print语句沿着第二个文件的行输出第一个文件中保存的值,除了使用 删除的第一个字段之外sub()

k代码第二部分中的变量是需要的,因为调用会sub()更改 的值$1

对 的调用sub()假定这FS是一个逗号。要改为使用 的实际值FS,无论它是什么,请使用

sub("^[^" FS "]*" FS,"")

反而。FS如果是单个字符,这将起作用。

您是否想使用对第二个文件中字段数量的先验知识,您可以避免对sub()k变量进行有点混乱的调用

$ awk -F , 'BEGIN { OFS = FS } NR == FNR { key[$1] = $0; next } ($1 in key) { print key[$1], $2, $3 }' file1 file2
799001,8_802,3122,627654,567765,v567575

相关内容