bash – 使用awk如何合并2个文件,比如A&B并执行左外连接功能
发布时间:2020-12-15 20:52:41 所属栏目:安全 来源:网络整理
导读:我有多个具有不同列数的文件,我需要在第一个文件和第二个文件上进行合并,并在与第一个文件相对应的awk中执行左外连接,并打印与两个文件的第一列匹配的两个文件中的所有列. 我尝试过以下代码来接近我的输出.但我无法打
我有多个具有不同列数的文件,我需要在第一个文件和第二个文件上进行合并,并在与第一个文件相对应的awk中执行左外连接,并打印与两个文件的第一列匹配的两个文件中的所有列.
我尝试过以下代码来接近我的输出.但我无法打印“,”,在第二个文件中找不到匹配的数字.下面是代码.加入需要排序并花费比awk更多的时间.我的文件大小很大,如3000万条记录. awk -F ',' '{ if (NR==FNR){ r[$1]=$0} else{ if($1 in r) r[$1]=r[$1]gensub($1,"",1)} }END{for(i in r){print r[i]}}' file1 file2
number,column1,column2,..columnN
numbr,..columnN
number,file1.column1,file1.column2,..file1.columnN,file2.column1,file2.column3...,file2.columnN
1,a,b,c 2,c 3,c 5,c
1,x,y 2,y 5,y 6,y 7,y
1,c,y 3,5,y 解决方法$cat tst.awk BEGIN { FS=OFS="," } NR==FNR { tail = gensub(/[^,]*,/,1) if ( FNR == 1 ) { empty = gensub(/[^,]/,"g",tail) } file2[$1] = tail next } { print $0,($1 in file2 ? file2[$1] : empty) } $awk -f tst.awk file2 file1 1,y 上面使用GNU awk for gensub(),与其他awks一起,它只是在最初分配后在适当的变量上执行[g] sub()的又一步. 您可能想要测试性能差异的一个有趣的(至少对我来说)替代方案是: $cat tst.awk BEGIN { FS=OFS=",1) idx[$1] = NR file2[NR] = tail if ( FNR == 1 ) { file2[""] = gensub(/[^,tail) } next } { print $0,file2[idx[$1]] } $awk -f tst.awk file2 file1 1,y 但我真的不希望它更快,甚至可能更慢. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |