繁体   English   中英

使用awk命令左外部联接多个文件数据

[英]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_filefile1连接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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM