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

使用awk,将一个文件中的多个密钥数据与第二个文件中的多个密钥值组合在一起?,awk,multiple-columns,key-value,substitution,Awk,Multiple Columns,Key Value,Substitution,data.txt(数据;键;数据;键): keys.txt(键;值;键;值;键;值): 因此,与Key1位于同一行的KeyA给出KeyA=100。 类似地,与Key2位于同一行的KeyA给出KeyA=200。 KeyB的类似程序 输出(将keys.txt中适当的两个值附加到data.txt的每一行): 例如,data.txt中的第一行包含Key1和KeyA,因此在keys.txt中查找包含Key1和KeyA的行 追加其相应的值,然后追加KeyA或KeyB,在本例中,KeyA为100。因此,key

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

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

因此,与Key1位于同一行的KeyA给出
KeyA=100
。 类似地,与Key2位于同一行的KeyA给出
KeyA=200
。 KeyB的类似程序

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

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


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

简单脚本可能满足您的要求。使用
awk
解析和提取data.txt中的键。您可以在keys.txt中找到相应的键值

#!/bin/bash                                                                                                                                                                                                  

while read i; do

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

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

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

done < data.txt
#/bin/bash
当我读书时;做
echo$i|awk'{printf“%s;”,$1}
键号=$(echo$i | awk-F';''{print$2}')
key_a_b=$(echo$i | awk-F';“{print$4}”)
grep$key_no keys.txt|awk-v key=“$key_a_b”-F'”{
如果(key==“KeyA”){printf”%d;%d\n“,$2,$4}
如果(key==“KeyB”){printf”%d;%d\n“,$2,$6}
}'
[${PIPESTATUS[0]}-ne 0]&&echo“-;-”
done
将其保存到名为
程序的文件中

BEGIN { FS=";"; }
NR==FNR {
    data[$1] = $2;
    data[$1, toupper($3)] = $4;
    data[$1, toupper($5)] = $6;
    next;
}
{
    one = data[$2];
    two = data[$2, toupper($4)];
    print $0 ";" (one ? one : "-") ";" (two ? two : "-");
}

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

Oops,你忘记发布代码了!StackOverflow是关于帮助人们修复代码的。这不是免费的编码服务。有代码总比没有代码好。即使您不知道如何编写程序,元代码也会演示您认为程序应该如何工作。请看一看关于改进这个问题的提示。纯awk解决方案很好,但对我来说它不起作用?:/b:第1行:意外标记附近的语法错误
。/b:第1行:
BEGIN{FS=“;”;}@Markus哪个版本的
awk
?GNU awk 4.0.1 Btw,我看不到输入文件(data.txt和keys.txt)在哪里您的解决方案中有吗?@Markus抱歉,我认为这很明显:
awk-f program keys.txt data.txt
.Markus-您问了多个awk问题,收到了多个答案,但您不知道如何使用发布的脚本,希望答案中包含命令,以便您可以复制/粘贴它???迈克尔-
one=数据[$2];。。。打印$0“;”(一?一:“-”)…
数据中创建元素,因此使用的内存超出了必要的范围,如果
数据[$2]
的数值计算结果为零,则打印将失败。您应该执行
one=(数据中的$2?数据[$2]:“-”;);。。。改为打印$0“;“一个…”
。谢谢,这是一个很棒的解决方案,结合了bash和awk,效果非常好。:)不,这是一个糟糕的想法,包含多个潜在的bug。请参阅此答案中的部分(但不是全部)问题。
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;-;-
#!/bin/bash                                                                                                                                                                                                  

while read i; do

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

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

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

done < data.txt
BEGIN { FS=";"; }
NR==FNR {
    data[$1] = $2;
    data[$1, toupper($3)] = $4;
    data[$1, toupper($5)] = $6;
    next;
}
{
    one = data[$2];
    two = data[$2, toupper($4)];
    print $0 ";" (one ? one : "-") ";" (two ? two : "-");
}