[英]using awk how to merge 2 files, say A & B and do a left outer join function and include all columns in both files
[英]Left outer join of multiple files data using awk command
我有基本文件,还有多个基于基本文件第1个字段具有共同数据的文件。 我需要所有数据组合的输出文件。 我尝试了许多命令,因为文件大小花了很多时间来输出很多次awk帮助了我,但我对awk数组编程示例一无所知
基本文件
aa
ab
ac
ad
ae
文件-1
aa,Apple
ab,Orange
ac,Mango
文件-2
aa,1
ab,2
ae,3
预期输出文件
aa,Apple,1
ab,Orange,2
ac,Mango,
ad,,
ae,,3
这是我尝试的:
awk -F, 'FNR==NR{a[$1]=$0;next}{if(b=a[$1]) print b,$2; else print $1 }' OFS=, test.txt test2.txt
您可以尝试2次连续join
。 类似以下功能的东西应该起作用:
join -a 1 -t, -e '' -o auto <(join -a 1 -t, -e '' -o auto base_file file1) file2
在这里,我们首先将base_file
和file1
连接base_file
,然后将结果与file2
连接在一起。
说明:
join -a 1 -t, -e '' -o auto base_file file1
:
-a 1
:即使在file1
没有匹配项,也显示base_file
的字段 -t,
我们对待人物,
作为我们的字段分隔符。 这会影响函数的输入文件和输出。 -e '' -o auto
:不存在任何字段时,输出字符串''
。 -e
选项取决于-o
选项。 -o auto
是默认的输出格式。 输出:
aa,Apple,1
ab,Orange,2
ac,Mango,
ad,,
ae,,3
awk方式:
awk -F, -v OFS="," 'NR==FNR{a[$1]=$2}FILENAME==ARGV[2]{b[$1]=$2}
FILENAME==ARGV[3]{print $0,a[$0],b[$0]}' f1 f2 base
对于任何数量的输入文件,它将在任何awk中工作:
$ cat tst.awk
BEGIN { FS=OFS="," }
!seen[$1]++ { keys[++numKeys] = $1 }
FNR==1 { ++numFiles }
{ a[$1,numFiles]=$2 }
END {
for (keyNr=1; keyNr <= numKeys; keyNr++) {
key = keys[keyNr]
printf "%s%s", key, OFS
for (fileNr=2;fileNr<=numFiles;fileNr++) {
printf "%s%s", a[key,fileNr], (fileNr<numFiles ? OFS : ORS)
}
}
}
$ awk -f tst.awk base file1 file2
aa,Apple,1
ab,Orange,2
ac,Mango,
ad,,
ae,,3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.