使用awk命令

时间:2016-11-30 11:23:05

标签: bash shell unix awk

我有基本文件和基于基本文件的第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

3 个答案:

答案 0 :(得分:1)

您可以尝试连续2次join。类似以下功能的东西应该有效:

join -a 1 -t, -e '' -o auto <(join -a 1 -t, -e '' -o auto base_file file1) file2

在此,我们先加入base_filefile1,然后将结果与file2一起加入。

说明:

  • join -a 1 -t, -e '' -o auto base_file file1

    • -a 1:即使base_file
    • 中没有匹配项,也会显示file1的字段
    • -t,:我们将字符,视为字段分隔符。这会影响输入文件和函数输出。
    • -e '' -o auto:当字段不存在时,输出字符串''-e选项取决于-o选项。 -o auto是默认输出格式。

输出

aa,Apple,1
ab,Orange,2
ac,Mango,
ad,,
ae,,3

答案 1 :(得分:1)

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

答案 2 :(得分:1)

这适用于任何数量的输入文件的任何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