使用第一列合并两个文件

Tom*_*aso 2 awk text-processing join

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

文件1.txt

A,info1,info2
234,info3,info4
CD,info5,info6
Run Code Online (Sandbox Code Playgroud)

文件2.txt

234,ccc,bb
CD,aaa,dd
Run Code Online (Sandbox Code Playgroud)

预期输出.csv

A,info1,info2,,
234,info3,info4,ccc,bb
CD,info5,info6,aaa,dd
Run Code Online (Sandbox Code Playgroud)

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

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

join -a 1 <(sort file1.txt) <( sort file2.txt) > output.csv
Run Code Online (Sandbox Code Playgroud)

有人可以帮我吗?

αғs*_*нιη 5

如果两个文件中的字段数相同,那么您可以-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
Run Code Online (Sandbox Code Playgroud)

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

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

join -t, -a1 -o0,1.2,1.3,2.2,2.3 <(sort file1) <(sort file2)
Run Code Online (Sandbox Code Playgroud)

-o #.k打印文件 number 中的第kth 个#字段。
-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
Run Code Online (Sandbox Code Playgroud)

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