다음 레코드가 포함된 파일이 있습니다(파이프로 구분됨).
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개의 레코드는 다음과 같습니다.
두 번째와 세 번째 레코드의 항목 번호가 동일합니다. 그런 다음 데이터베이스 UKPROD
와 데이터베이스 사이에 존재하는지 확인합니다 QADDB
. 그렇다면 데이터베이스에 있는 레코드의 상태 플래그를 "X" 로 표시합니다 QADDB
.
답변1
UKPROD
각 제품 ID 항목의 순서가 QADDB
고정되어 있지 않으면 파일을 두 번 읽고 처리해야 할 것 같습니다. 첫 번째 단계에서는 UKPROD
데이터베이스(필드 #1)에 있는 모든 제품의 조회 테이블을 구축한 다음 두 번째 확인에서는 표시된 각 제품이 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
그러나 더 나은 구현이 있을 수 있습니다. 실제 데이터베이스를 참조 UKPROD
하는 경우 QADDB
플랫 파일 처리를 테스트하는 것보다 실제 데이터베이스 쿼리를 수행하는 것이 더 효율적일 수 있습니다.