次のレコードを含むファイルがあります(パイプで区切られています)。
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つのレコードは次のとおりです。
2番目と3番目のレコードの項目番号は同じです。次に、データベースUKPROD
とデータベースの間に存在することを確認しますQADDB
。その場合は、データベース内のレコードのステータスフラグを「X」とマークしますQADDB
。
答え1
UKPROD
各製品ID項目の順序がQADDB
固定されていない場合は、ファイルを2回読み取って処理する必要があるようです。最初のステップでは、UKPROD
データベース(フィールド#1)内のすべての製品のルックアップテーブルを構築し、2番目の確認では、表示されている各製品が存在することを確認QADDB
しますUKPROD
。たとえば、考えられる解決策の1つ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
しかし、より良い実装があるかもしれません。物理データベースを参照してUKPROD
いる場合は、QADDB
フラットファイル処理をテストするよりも実際のデータベースクエリを実行する方が効率的です。