awk脚本在三个文件中查找数据并执行替换操作

时间:2018-03-28 05:47:23

标签: awk

道歉导致不便但需要解决此问题。 有三个文件。 关于文件串联或拆分等的任何其他方法都是值得赞赏的

  

如果file1的column1(billngtype)包含YMNC或YPBC,则选择   column2的值(文档编号)。现在找到这个文档编号   column1(billdoc)的file2和grep的对应值   File2中的column2(price)。现在需要找到这个值   File3的column1(salesdoc)中的File2的column2(price)和需要   从值column2(Refdoc)获取相应的值   来自FIle3的Column1(salesdoc)。如果从中捕获值   File3的column2(refdoc)。把这个价值放进去吧   File1的column3(originadocumentnumber)。

对于前 -

  

如果文件1,column1(billingtype)具有YMNC和column2(文档编号)   值为420075416,并且File2的column1(Billdoc)中存在相同的值   在最后一行,然后从column2(price)获取值,即   5049641151再次表示column1(billdoc)420075416。现在找到该值   取自FIle3中FIle2的第2列(价格)。我们可以看到5049641151是   存在于File3中的column1(Salesdoc)中。现在获取相应的   column2(Refdoc)的值为6225972627.现在复制最终版本   在column3(originaldocumentnumber)中获取的值(6225972627)   column2(documentnumber)420075416

File1中

billingtype documentnumber  originaldocumentnumber
YMNC            420075416    765467
YMNC            429842808    
YPBC            429842809    
INV             430071605    7688888
YPBC            430071609

文件2

  Billdoc   price
4200754167  5049641141
429842808   5049641143
6400392213  5049641145
430071609   5049641147
429842809   5049641149
420075416   5049641151

文件3

  Salesdoc  Refdoc  
5049641151  6225972627
5049641143  6225973664
5049641147  6225973574
5049641145  6225973553
5049641149  6225973639
5049641141  6225973652

预期输出文件1

billingtype documentnumber  originaldocumentnumber
YMNC            420075416    6225972627
YMNC            429842808    6225973664
YPBC            429842809    6225973639
INV             430071605   
YPBC            430071609    6225973574

1 个答案:

答案 0 :(得分:0)

您可以使用此简单流程:

awk 'FILENAME=="file2"{bd[$1]=$2;next}
     FILENAME=="file3"{sd[$1]=$2;next}
     FNR>1{$3=sd[bd[$2]]}1' OFS="\t" file2 file3 file1

<强>结果

billingtype documentnumber  originaldocumentnumber
YMNC    420075416       6225972627
YMNC    429842808       6225973664
YPBC    429842809       6225973639
INV     430071605
YPBC    430071609       6225973574

<强>解释

file2和file3

FILENAME=="file2"{bd[$1]=$2;next}FILENAME=="file3"{sd[$1]=$2;next}:创建两个哈希,其中第一个值(键)指向第二个值(由文件名统治)。现在bd包含 BillingDoc (file1)信息和sd SallesDoc (file2)数据。

<强>文件1

FNR>1:跳过file1的第一行以避免标题操作。

bd[$2]:指向结算文档哈希,其中密钥等于源文件(file1)第二列,这将为我们提供&# 39;价格值。

因此sd[bd[$2]]将返回与该价格相关联的 refdoc

$3=sd[bd[$2]]:将结果分配给预期输出的第三个字段。

<强>可视化

最后的1只是一个快捷方式,以避免使用print语句。

awk条件匹配时,默认操作是打印输入行。

$ echo "test" |awk '1'

相当于:

echo "test"|awk '1==1'

echo "test"|awk '{if (1==1){print}}'

那是因为1将永远是真的

最后一步将de O 输出 F ield S eparator设置为 TAB OFS="\t"以获得我们预期的结果。