道歉导致不便但需要解决此问题。 有三个文件。 关于文件串联或拆分等的任何其他方法都是值得赞赏的
如果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
答案 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"
以获得我们预期的结果。