![如何根据一列的匹配合并两个文件?](https://linux22.com/image/188330/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%E4%B8%80%E5%88%97%E7%9A%84%E5%8C%B9%E9%85%8D%E5%90%88%E5%B9%B6%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我有两个文件B.csv
:
1,AD
2,AB
3,AC
5,AF
7,AE
和C.csv
:
1,x
3,z
5,y
我如何获得这个输出:
1,AD,x
2,AB,
3,AC,z
5,AF,y
7,AE,
通过匹配两个文件中的公共列 1?
答案1
使用加入
join -t, -a1 B.csv C.csv
表示-a1
左外连接(即显示 file1 中不在 file2 中的行)
如果逗号位于不成对行的末尾真的事情
(join -t, B.csv C.csv ; join -t, -v1 B.csv C.csv | perl -pe "s/$/,/" ) | sort
答案2
使用时awk
不会打乱原始文件的行,但需要将第一个文件加载到内存中,并且您需要注意不要在无法放入内存的大文件上运行。
awk 'BEGIN { FS=OFS="," }
NR==FNR { hold[$1]=$2; next }
{ print $0, hold[$1] }' fileC fileB
对于这种情况,当 fileC 中存在密钥但 fileB 中不存在,并且要打印 fileC 中的密钥时,请执行以下操作:
awk 'BEGIN { FS=OFS="," }
NR==FNR { hold[$1]=$2; next }
{ print $0, hold[$1]; delete hold[$1] }
END{ for(x in hold) print x, hold[x] }' fileC fileB