设置标志以根据记录的某些值从文件中删除重复记录

设置标志以根据记录的某些值从文件中删除重复记录

我有一个包含以下记录的文件(以竖线分隔):

SK200-10|ALBUMIN-SK|INS|SEKURE ALBUMIN 2 X 65ML|REAG-IVD|SEKI-PEI|90|14IAG|KIDNEY/LIVER|MD|NA|0|U|MFGPRO|15-May-2014|15-May-2014|MFGPRO|CAPPROD
P/G-PPR|NA-INS|INS|GEWINDEFLASCHE +DECKEL ROT|NON-REAG|ZINSSER|0|NA|NA|NA|NON-REAG|0|U|DM|3-Jun-2014|3-Jun-2014|MFGPRO|UKPROD
P/G-PPR|NA-INS|INS|GEWINDEFLASCHE +DECKEL ROT|NON-REAG|ZINSSER|0|NA|NA|NA|NON-REAG|0|U|DM|3-Jun-2014|3-Jun-2014|DM|QADDB
2898|OTHER-RT|RT|PRINTED MEMBRANE, ADENOVIRUS|NON-REAG|SEKI-SD|60|NA|NA|NA|NA|0|U|MFGPRO|24-Apr-2013|24-Apr-2013|MFGPRO|PACEPROD

在这些用竖线分隔的记录中: 第一个值是项目编号。第 13 个值是状态标志。最后一个值是数据库名称。

根据数据库中的项目编号检查重复UKPROD记录QADDB。如果发现重复项:将数据库中状态标志的值(第 13 个值)更改为“X” QADDB

例如上面4条记录:

第二条和第三条记录的项目编号相同。然后我检查它们是否存在于UKPRODQADDB数据库之间。如果是,则我将数据库中的记录的状态标志标记为“X” QADDB

答案1

UKPROD如果每个产品 ID 的和条目的顺序QADDB不固定,那么我认为您将需要读取和处理该文件两次 - 在第一次传递时,构建数据库中所有产品(字段 #1)的查找UKPROD表,并在第二次检查中检查显示的每个产品QADDB是否存在于 中UKPROD。例如,一种可能的解决方案awk可能是

awk -F\| '
BEGIN{OFS=FS}; 
NR==FNR {if ($NF=="UKPROD") ukprod[$1]++; next} 
NR!=FNR {if (ukprod[$1] && $NF=="QADDB") $13="X"} 
1' yourfile yourfile

但可能有更好的实现。如果UKPRODQADDB引用实际数据库,那么执行实际数据库查询可能比测试处理平面文件更有效。

相关内容