使用第一列合并两个文件

使用第一列合并两个文件

我有两个不同的文件,我想使用第一列合并它们的信息。

文件1.txt

A,info1,info2
234,info3,info4
CD,info5,info6

文件2.txt

234,ccc,bb
CD,aaa,dd

预期输出.csv

A,info1,info2,,
234,info3,info4,ccc,bb
CD,info5,info6,aaa,dd

我尝试使用awk(不是我的脚本)joingrep但没有获得所需的结果。

awk -F "," 'FNR==NR {h[$1] = $2;next} BEGIN{ OFS = "\t"} {print $0,$2?h[$1]:"0"}' file1.txt prova2.txt

join -a 1 <(sort file1.txt) <( sort file2.txt) > output.csv

有人可以帮我吗?

答案1

如果两个文件中的字段数相同,那么您可以-o auto根据每个文件的第一行填充每行中的字段数(默认情况下,它使用-e选项的值填充缺失的字段,默认情况下它是空格字符,但你可以将其更改为任何字符细绳你要);

$ join -t, -a1 -o auto <(sort file1) <(sort file2)
234,info3,info4,ccc,bb
A,info1,info2,,
CD,info5,info6,aaa,dd

我们还添加了-t,指定输入和输出文件的字段分隔符。
如果要添加仅存在于 file2 中的行,请添加-a2到命令中。

上面的命令是下面命令的缩写版本,我们明确指出要输出哪些字段:

join -t, -a1 -o0,1.2,1.3,2.2,2.3 <(sort file1) <(sort file2)

-o #.k打印文件 number 中的k第 th 个#字段。
-o 0这里输出不可配对的线路。


或者使用awk

awk 'BEGIN{ FS=OFS=","; na="" }
              { key=$1; sub(/[^,]*,/, "") }
NR==FNR       { file1[key]=$0; next }
(key in file1){ print key, file1[key], $0; delete file1[key] }

END{ for(key in file1) print key, file1[key], na, na }' file1 file2

{ key=$1; sub(/[^,]*,/, "") }操作中,我们从第一列进行备份,然后通过sub()将行条带化到第一个逗号字符来删除该列,因此剩余的内容将是该列的值钥匙以供以后使用。

相关内容