Unix 스크립트는 동일한 키 레코드와 비교하여 데이터를 처리합니다.

Unix 스크립트는 동일한 키 레코드와 비교하여 데이터를 처리합니다.

내가 겪고 있는 문제는 입력 파일에 유효한 날짜와 종료 날짜 기록이 있다는 것입니다. 처음 6개 필드는 키(12345A)입니다. 동일한 키인 1일을 사용하는 다음 레코드의 유효한(8개 위치) 날짜를 기반으로 종료 날짜(18개 위치)를 업데이트해야 합니다. 유효 날짜가 가장 최근인 레코드의 경우 종료 날짜는 9999-12-31로 유지되어야 합니다. 다음은 입력 및 출력 기대치입니다. 누구든지 나를 도와줄 수 있나요? 테이블이 언로드되면서 파일 A를 가져오고 종료 날짜가 이와 같이 채워질 것으로 예상하는 인터페이스 응용 프로그램에 나중에 보내야 합니다. 테이블 자체의 종료 날짜를 변경할 수 없습니다. 이는 언로드 시 변경하려고 하는 것입니다. 이유 파일.

데이터 구분 기호/구분 기호가 없으며 키 길이는 항상 동일하게 유지됩니다.

입력 파일):

12345A22021-01-259999-12-31
12345A12021-01-019999-12-31
12345B32021-02-159999-12-31
67899C12021-03-019999-12-31
67899D32021-05-249999-12-31
67899D22021-04-029999-12-31

출력(파일 B):

12345A22021-01-259999-12-31
12345A12021-01-012021-01-24
12345B32021-02-159999-12-31
67899C12021-03-019999-12-31
67899D32021-05-249999-12-31
67899D22021-04-022021-05-23

답변1

sed동일한 ID를 가진 이전 레코드의 유효한 날짜가 종료 날짜로 간주되는 한 다음과 같은 기준 및 패턴을 사용하여 N;P;D이 작업을 수행 할 수 있습니다 .

sed '$!N;s/^\(.\{6\}\)\(.\)\(.\{10\}\)\(.*\n\1.\{11\}\).*/\1\2\3\4\3/;P;D'

그러나 날짜를 변경해야 한다면 GNU와 같이 달력을 이해하는 유틸리티가 필요합니다 date.

date -d "2021-09-08 yesterday" +"%Y-%m-%d"

2021-09-07나는 많은 버전이 date이것을 할 것이라고 생각 합니다 . 그러나 현재 GNU date및 GNU 의 경우 sed다음과 같이 작동합니다.

sed -nE 'G
  s/^(.{6})(.{11}).*\n\1.(.{10}).*/\1\2\3/p
  s/\n.*//p
  s/^(.{7})(.{10})/echo \1$(date -d "\2 yesterday" +"%Y-%m-%d")/e
  h' fileA > fileB

설명해 보겠습니다.

  • n기본 출력을 억제하는 옵션과 E정규식을 확장하는 옵션을 사용합니다 (가독성을 위해).
  • G이전 행을 유지할 예약된 공간을 추가하고 적절한 날짜를 추가합니다(아래 참조).
  • s/^(.{6})(.{11}).*\n\1.(.{10})/\1\2\3/p동일한 ID(따라서 역참조 \1) 가 있는 경우 현재 행의 날짜를 예약된 공간의 조정된 날짜로 바꾸고 p인쇄합니다.
  • s/\n.*//p대체가 발생하지 않으면 추가 줄을 제거하고 p인쇄하십시오.
  • s/^(.{7})(.{10})/echo \1$(date -d "\2 yesterday" +"%Y-%m-%d")/eGNU sedexecute 플래그를 활용하여 날짜를 date유틸리티에 보내 날짜를 줄입니다.
  • h공간을 절약하려면 변경된 행을 저장하세요.

관련 정보