我有两个 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