使用 awk,将一个文件中的多个键数据与第二个文件中的多个键值组合?

Using awk, combine multiple key-data in one file with multiple key-values from a second file?

data.txt(数据;键;数据;键):

Data1;Key1;DataA;KeyA
Data2;Key2;DataB;KeyB
Data3;Key3;DataC;KeyA
Data4;Key2;DataC;KeyB
Data3;Key1;DataB;KeyA
Data2;Key5;DataA;KeyB

keys.txt(键;值;键;值;键;值):

Key1;10;keyA;100;keyB;1000;
Key2;20;keyA;200;keyB;2000;
Key3;30;keyA;300;keyB;3000;
Key4;30;keyA;400;keyB;4000;

因此,与 Key1 在同一行的 KeyA 给出 KeyA=100。 同样,与 Key2 在同一行的 KeyA 给出 KeyA=200。 KeyB 的类似过程。

输出(将 keys.txt 中适当的两个值附加到 data.txt 的每一行):

Data1;Key1;DataA;KeyA;10;100
Data2;Key2;DataB;KeyB;20;2000
Data3;Key3;DataC;KeyA;30;300
Data4;Key2;DataC;KeyB;20;2000
Data3;Key1;DataB;KeyA;10;100
Data2;Key5;DataA;KeyB;-;-

例如data.txt中的第一行包含Key1和KeyA,因此在keys.txt中找到包含key1和KeyA的行 附加其相应的值,然后附加 KeyA 或 KeyB,在本例中 KeyA 为 100。因此 keys.txt 中第一行的 KeyB 不是 用于输出第一行中的任何内容。

data.txt中的最后一行包含Key5,但keys.txt中没有Key5,因此附加一个默认值;-;-

简单的脚本可能会满足您的要求。使用 awk 解析并提取 data.txt 中的键。您可能会在 keys.txt.

中找到相应的键值
#!/bin/bash                                                                                                                                                                                                  

while read i; do

  echo $i | awk '{printf "%s;",}'
  key_no=$(echo $i | awk -F';' '{print }')
  key_a_b=$(echo $i | awk -F';' '{print }')

  grep $key_no keys.txt | awk -v key="$key_a_b" -F';' '{
      if (key=="KeyA") {printf "%d;%d\n",,}
      if (key=="KeyB") {printf "%d;%d\n",,}
    }'

  [ ${PIPESTATUS[0]} -ne 0 ] && echo "-;-"

done < data.txt

将其保存到名为 program 的文件中:

BEGIN { FS=";"; }
NR==FNR {
    data[] = ;
    data[, toupper()] = ;
    data[, toupper()] = ;
    next;
}
{
    one = data[];
    two = data[, toupper()];
    print [=10=] ";" (one ? one : "-") ";" (two ? two : "-");
}

然后,调用awk -f program keys.txt data.txt