내가 겪고 있는 문제는 입력 파일에 유효한 날짜와 종료 날짜 기록이 있다는 것입니다. 처음 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")/e
GNUsed
의e
xecute 플래그를 활용하여 날짜를date
유틸리티에 보내 날짜를 줄입니다.h
공간을 절약하려면 변경된 행을 저장하세요.