在AWK命令中初始化一个数组,并使用AWK使用数组打印

时间:2018-02-09 06:19:17

标签: bash awk

我试图对2个文件数据进行比较并打印出来。

我的目标主要是在同一个awk语句中初始化包含一些值的araay,并将其用于某些打印目的。

下面是我正在使用的Command,我感觉看起来像是一些语法错误。

请在AWK部分帮助我如何定义数组以及如何在其中使用它。

尝试了命令 -

paste -d "|" filedata.txt tabdata.txt | awk -F '|' '{array=("RE_LOG_ID" "FILE_RUN_ID" "FH_RECORDTYPE" "FILECATEGORY")}' '{c=NF/2;for(i=1;i<=c;i++)if($i!=$(i+c))printf "%s|%s|%s|%s\n",$1,${array[i]},$i,$(i+c)}'

示例输入文件

filedata.txt

A|1|2|3
B|2|3|4

tabdata.txt

A|1|4|3
B|2|3|7

所以我想要的输出是。 -

A|FH_RECORDTYPE|2|4
B|FILECATEGORY|4|7

输出包含差异 -

PRIMARYKEY|COLUMNNAME|FILE1DATA|FILE2DATA

我想将数组在AWK中初始化为array =(“RE_LOG_ID”“FILE_RUN_ID”“FH_RECORDTYPE”“FILECATEGORY”)并且将对应列名

从数组条件中获取的列名是何时($ i!= $(i + c))无论哪个“i”位置不匹配,我都会从数组中打印出“i”元素。

如果我从命令中删除数组部分,找到差异部分是完美的,但我的问题是我想初始化一个包含列名的数组,并在awk语句中打印它。

我需要帮助如何将数组部件合并到AWK中。

1 个答案:

答案 0 :(得分:2)

不幸的是,AWK中的数组无法按预期分配。作为替代方案,您可以使用split函数,如:

split("RE_LOG_ID FILE_RUN_ID FH_RECORDTYPE FILECATEGORY", array, " ")

(因为FS被覆盖,所以需要“”。)
然后您的命令将如下所示:

paste -d "|" filedata.txt tabdata.txt | awk -F '|' '
BEGIN {split("RE_LOG_ID FILE_RUN_ID FH_RECORDTYPE FILECATEGORY", array, " ")}
{
    c= NF/2;
    for(i=1; i<=c; i++)
        if ($i != $(i+c))
            printf "%s|%s|%s|%s\n", $1, array[i], $i, $(i+c);
}'