我有两个不同的文件,我想使用第一列合并它们的信息。
文件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
(不是我的脚本)join
,grep
但没有获得所需的结果。
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()
将行条带化到第一个逗号字符来删除该列,因此剩余的内容将是该列的值钥匙以供以后使用。