如何根据一列的匹配合并两个文件?

如何根据一列的匹配合并两个文件?

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

相关内容