【问题标题】:Awk script to find data in three file and perform replace operationawk 脚本在三个文件中查找数据并执行替换操作
【发布时间】:2018-03-28 05:47:23
【问题描述】:

如果造成不便,我们深表歉意,但需要解决此问题。 有三个文件。 任何其他关于文件连接或拆分等的方法都值得赞赏

如果 file1 的 column1(billngtype) 包含 YMNC 或 YPBC,则选择 column2(文档编号)的值。现在在 file2的column1(Billdoc)和grep对应的值 File2 中的 column2(价格)。现在需要找到这个值取自 File3 的 column1(salesdoc) 中 File2 的 column2(price),需要 根据值从 column2(Refdoc) 中获取相应的值 来自 FIle3 的 Column1(salesdoc)。如果从 File3 的 column2(refdoc)。把那个值放进去 File1 的第 3 列(原始文档编号)。

前-

如果文件 1,column1(billingtype) 有 YMNC 和 column2(documentnumber) 值为 420075416 并且 File2 的 column1(Billdoc) 中存在相同的值 在最后一行,然后从 column2(price) 获取值 5049641151 与 column1(billdoc) 420075416 相对。现在找到值 取自 FIle3 中 FIle2 的 column2(price)。我们可以看到 5049641151 是 存在于 File3 的 column1(Salesdoc) 中。现在获取对应的 column2(Refdoc) 中的值是 6225972627。现在复制最终的 在第 3 列(原始文档编号)中获取的值(6225972627) column2(documentnumber) 420075416

文件1

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

【问题讨论】:

  • 展示你当前的方法。

标签: awk


【解决方案1】:

您可以使用这个简单流程:

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]: 指向 Billing Doc 散列,其中键等于源文件 (file1) 第二列,这将为我们提供它的价格值。

所以sd[bd[$2]] 将返回与该价格关联的refdoc

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


可视化

末尾的1 只是一个快捷方式,以避免使用打印语句。

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

$ echo "test" |awk '1'

相当于:

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

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

那是因为 1 永远为真

最后一步设置de O输出FS分隔符设置为TAB OFS="\t" 得到我们预期的结果。

【讨论】:

  • @Klashxx..非常感谢..如果有其他问题会告诉你:)
  • 嗨@Klashxx ..在您的解决方案中,我们不考虑第一个语句..如果 file1 的 column1(billngtype) 包含 YMNC 或 YPBC ..请告诉我我们可以在哪里包含这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 2013-11-08
  • 1970-01-01
  • 2016-10-20
  • 2013-03-22
相关资源
最近更新 更多