使用 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
。
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
。