我试图对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中。
答案 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);
}'